python re:在任何情况下查找从“string”开始的单词

时间:2012-01-27 22:42:10

标签: python regex string

我正在尝试创建一个正则表达式,在任何情况下都会返回以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 :(得分: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()将返回组的元组,而不仅仅是您感兴趣的部分

答案 1 :(得分:0)

你可以试试......

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

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

答案 2 :(得分: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

正则表达式中的^表示该单词必须以条形码开头。

答案 3 :(得分:0)

仅供记录:如果您在字符类中使用\A,例如r"[\A]",它应该被视为文字A.然而,它被默默地忽略。 \B\Z也是如此。

我有reported错误。