re python: найти слова, начинающиеся с "string" в любом случае - PullRequest
1 голос
/ 28 января 2012

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

string = u'baRbarus, semibarbarus: qui BARbari sunt, alteres BARBARos non sequuntur!'
# output is...
>>> ['baRbar', 'BARbar', 'BARBAR']

я пробовал такой код:

re.compile(ur"([\A\b]*)(barbar)", re.UNICODE | re.IGNORECASE).findall(string)
# it returns...
[(u'', u'baRbar'), (u'', u'barbar'), (u'', u'BARbar'), (u'', u'BARBAR')]

Кажется, я что-то не так понял.Не могли бы вы мне помочь, пожалуйста?И будет здорово, если вы посоветуете несколько хороших руководств по модулю re.Слишком сложно понять re из документации по умолчанию для Python.Спасибо!

Ответы [ 4 ]

1 голос
/ 28 января 2012

Следующего регулярного выражения достаточно для того, что вы хотите сделать (если установлены флаги):

\bbarbar

Пример:

>>> s = u'baRbarus, semibarbarus: qui BARbari sunt, alteres BARBARos non sequuntur!'
>>> re.findall(r'\bbarbar', s, re.IGNORECASE | re.UNICODE)
[u'baRbar', u'BARbar', u'BARBAR']

Вот некоторые комментарии к вашему текущемурегулярное выражение, которое может объяснить, почему \bbarbar выполняет работу:

  • [\A\b] - \A обычно является началом строки, а \b является границей слова, но внутри класса символов \b становится пробелом, и я не совсем уверен, что \A становится
  • [\A\b]* - поэтому ваше регулярное выражение соответствует 'semibarbarus', * означает 0 или больше, поэтому это не тактребует, чтобы эта часть соответствовала, если вы отбросили * и исправили вышеуказанную проблему, это сработало бы
  • ([\A\b]*)(barbar) - Несколько групп означают, что re.findall() вернет кортеж групп, а не толькоинтересующая вас часть
0 голосов
/ 29 января 2012

Только для записи: если вы используете \A внутри класса символов, например r"[\A]", к нему следует относиться как к буквальному значению А. Однако это игнорируется. То же самое происходит с \B и \Z.

Я сообщил ошибка.

0 голосов
/ 28 января 2012

Поскольку вы хотите, чтобы только слова начинались с barbar, вы должны разделить строку раньше. Поэтому вы должны сделать что-то вроде этого:

def findBarbarus(my_string):
  result = []
  for s in my_string.split(" "):
    result += re.compile(ur"(^barbar)", re.UNICODE | re.IGNORECASE).findall(s)
  return result

* * * * * В регулярном выражении ^ означает, что слово должно начинаться с barbar.

0 голосов
/ 28 января 2012

Вы можете попробовать ...

string = 'baRbarus, semibarbarus: qui BARbari sunt, alteres BARBARos non sequuntur!'

l=re.findall(' barbar.+? |^barbar.+? ', string, re.IGNORECASE)
print l
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...