python的re:查找任意大小写以“string”开头的单词

1 投票
4 回答
2086 浏览
提问于 2025-04-17 11:15

我想写一个正则表达式,能够找到所有以 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 模块的好教程,那就太好了。因为从Python的默认文档中理解 re 实在是太难了。谢谢!

4 个回答

0

你可以试试...

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

l=re.findall(' barbar.+? |^barbar.+? ', string, re.IGNORECASE)
print l
0

因为你只想要以“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”开头。

1

下面这个正则表达式可以满足你的需求(只要设置了标志):

\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() 会返回一个包含所有分组的元组,而不仅仅是你感兴趣的那部分。

撰写回答