我正在尝试创建一个正则表达式,在任何情况下都会返回以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
太难了。谢谢!
答案 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错误。