Regex Python – почему конец строки ($ и \ Z) не работает с групповыми выражениями?

В Python 2.6. кажется, что маркеры конца строки $ и \Z несовместимы с групповыми выражениями. Пример Fo

 import re re.findall("\w+[\s$]", "green pears") 

возвращается

 ['green '] 

(так что $ эффективно не работает). И используя

 re.findall("\w+[\s\Z]", "green pears") 

приводит к ошибке:

 /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc in findall(pattern, string, flags) 175 176 Empty matches are included in the result.""" --> 177 return _compile(pattern, flags).findall(string) 178 179 if sys.hexversion >= 0x02020000: /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc in _compile(*key) 243 p = sre_compile.compile(pattern, flags) 244 except error, v: --> 245 raise error, v # invalid expression 246 if len(_cache) >= _MAXCACHE: 247 _cache.clear() error: internal: unsupported set operator 

Почему это работает так и как идти?

3 Solutions collect form web for “Regex Python – почему конец строки ($ и \ Z) не работает с групповыми выражениями?”

Выражение [..] представляет собой группу символов , то есть она будет соответствовать любому содержащемуся в ней символу. Таким образом, вы сопоставляете буквенный символ $ . Группа символов всегда применяется к одному входному символу и поэтому никогда не может содержать якорь.

Если вы хотите совместить символ пробела или конец строки, вместо этого используйте группу без захвата, в сочетании с | или селектор:

 r"\w+(?:\s|$)" 

Кроме того, посмотрите на якорь границы слова. Он будет соответствовать где угодно, когда \w группа запускается или заканчивается (поэтому она привязывается к точкам в тексте, где символ \w предшествует или сопровождается символом \W , или находится в начале или в конце строки).

Квадратные скобки не указывают группу, они указывают набор символов, который соответствует одному символу (любой из них в скобках). Как описано в документе , «специальные символы теряют свое особое значение внутри множеств» (за исключением тех случаев, когда указано иначе как с классами, например \s ).

Если вы хотите совместить \s или конец строки, используйте что-то вроде \s|$ .

Ответ Martijn Pieters верен. Чтобы разработать немного, если вы используете группы захвата

 r"\w+(\s|$)" 

Вы получаете:

 >>> re.findall("\w+(\s|$)", "green pears") [' ', ''] 

Это потому, что re.findall() возвращает значения захваченной группы (\s|$) .

Скобки () используются для двух целей : группы символов и группы захвата. Чтобы отключить захваченные группы, но по-прежнему действуют как группы символов, используйте (?:...) синтаксис:

 >>> re.findall("\w+(?:\s|$)", "green pears") ['green ', 'pears'] 
  • Python - использование регулярных выражений для поиска нескольких совпадений и их распечатки
  • Python - регулярное выражение для каталога
  • Python: анализ числовых значений из строки с использованием регулярных выражений
  • Что такое метод Python для создания синтаксического цикла синтаксиса \ G?
  • Регулярное выражение для поиска палиндромов, ведущих себя странно
  • Непоследовательность между $ и ^ в regex при использовании аргументов start / end для re.search?
  • Обработка HTML-файла с использованием Python
  • Проверьте, соответствует ли строка шаблону
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.