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?
  • Как разделить длинные правила регулярных выражений на несколько строк в Python
  • Является ли лучший способ сопоставить два разных повторения одного и того же класса символов в регулярном выражении?
  • Самый быстрый метод Python для поиска и замены на большой строке
  • Как совместить - но не захватывать - в регулярных выражениях Python?
  • В python существует ли «Find-Replace целое слово»?
  • Python: как определить, существует ли список слов в строке
  • Заменить в строке на основе функции
  • Python - лучший язык программирования в мире.