поиск по регулярному выражению не работает при изменении порядка шаблона - PullRequest
0 голосов
/ 24 февраля 2019

Я просто пишу маленькое регулярное выражение для фильтрации электронной почты из строки.Когда я использую шаблон как patt=r'[\w.-]+@[\w.-]+', он работает нормально.Но когда я использую шаблон как patt1=r'[\w-.]+@[\w-.]+', он выдаёт мне ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 146, in search
    return _compile(pattern, flags).search(string)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 251, in _compile
    raise error, v # invalid expression
sre_constants.error: bad character range

Код:

1-й случай:

>>> str="hello@abc.com"
>>> patt=r'[\w.-]+@[\w.-]+'
>>> match=re.search(patt, str)
>>> match.group()
'hello@abc.com'

2-й случай:

>>> str="hello@abc.com"
>>> patt=r'[\w-.]+@[\w-.]+'
>>> match=re.search(patt, str)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 146, in search
    return _compile(pattern, flags).search(string)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 251, in _compile
    raise error, v # invalid expression
sre_constants.error: bad character range

Есть идеи, что я делаю не так во втором регулярном выражении?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Тире (-) внутри класса символов ([]) обозначает диапазон символов, т.е. от-до .Итак, если вы хотите использовать литерал -, у вас есть 3 варианта:

  • поставить - в начале: [-foo]
  • поставить - в конце: [foo-]
  • побег - с \: [foo\-bar]
0 голосов
/ 24 февраля 2019

Дефисы - должны быть первыми или последними в списке.Они имеют особое значение, когда используются между двумя символами для обозначения диапазона, например [A-Z] (все заглавные буквы).Когда дефис находится в конце или в начале, он не имеет специального значения.

Кроме того, экранирование \- будет работать в Python, но будьте осторожны, в других реализациях / языках это может не произойти.

Проверьте принятый ответ здесь: Regex - должны ли быть экранированные дефисы?

Не тот же вопрос, что и у вас, но затрагивает похожую информацию.

...