функция извлечения панд с регулярным выражением ведет себя иначе, чем "нормальное" извлечение регулярного выражения? - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь извлечь 1-n строк, разделенных символом новой строки, которые находятся между "началом" (SOMEWORD в примере) и словом "стоп" (SOME STOP WORD в примере) из кадра данных pandas через str.extractметод, но он терпит неудачу, и результат просто NaN.Примеры приведены ниже.

Я пытался построить регулярное выражение с помощью regex101.com и там оно работает, и даже когда я копирую автоматически сгенерированный пример кода из regex101.com в мой блокнот jupyter, он извлекает строкикак я и ожидал.

Пример кода с функцией pandas str.extract:

testInput = pd.DataFrame({'text': ['\nSOMEWORD\n---------- \nFirstline with some text\nSecondline with some text\nThirdline 
with some text\nSOME STOP WORD\n-------------------\n']})
pattern = r'(?<=\nSOMEWORD\n----------\n)(\w.+?(?=\nSOME STOP WORD))'
test = testInput.iloc[0].str.extract(pattern)
test

, который выводит:

text    NaN
Name: 0, dtype: object

Пример кода с regex101.com (iВключите только ссылку, чтобы сообщение не было длинным. На сайте вы также можете скопировать автоматически сгенерированный код, который работает и извлекает только строки между начальным и конечным словами): https://regex101.com/r/JM6Sgc/1

Поэтому мои 2 вопроса:

  • почему мое регулярное выражение не работает с функцией извлечения pandas str
  • почему я не должен сбежать \ nв функции извлечения панд, но на сайте regex101, а также в «обычном» коде regex?Пример шаблона:

    • Успешное извлечение первой строки:
      • pattern = r '(? <= \ NSOMEWORD \ n ---------- \ n) (\w. +) '</li>
    • Не удалось извлечь первую строку и вывести NaN:
      • pattern = r' (? <= \\ nSOMEWORD \\ n ---------- \\ n) (\ w. +) '</li>

1 Ответ

0 голосов
/ 29 декабря 2018

Вы можете отказаться от поисков и проверить соответствие строк и переопределить поведение . с помощью модификатора re.DOTALL (который вы можете установить в качестве встроенного модификатора, (?s)):

r'(?s)\nSOMEWORD\n----------\n(\w.+?)\nSOME STOP WORD'

См. regex demo

Подробности

  • (?s) - встроенный модификатор re.DOTALL, который позволяет . соответствовать любомуchar, включая символ новой строки char
  • \nSOMEWORD\n----------\n - литеральная подстрока, где \n соответствует литералу LF char
  • (\w.+?) - группа 1 (это значение будет возвращено str.extract): слово char, за которым следуют 1+ символов, как можно меньше
  • \nSOME STOP WORD - LF и SOME STOP WORD подстрока
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...