我有三个字符串:
s1 = "A blah blah blah." # match A
s2 = "Blah blah blah. A blah blah." # match A
s3 = "Blah blah blah A." # don't match 'A'
我正在尝试编写一个正则表达式,它将匹配前两个字符串中A
的出现次数,但不会匹配第三个字符串:即,我希望匹配A
的出现位置一行或一句话的开头但不在其他地方。
我尝试了以下正则表达式:
regex = "(^|(. ))A"
regex = "[^(. )]A"
使用re.search()
,其中第一个匹配所有三个A;第二个没有匹配。
我正在使用Python 3.5。
答案 0 :(得分:2)
你几乎是正确的。 "(^|\. )A"
有效。你必须逃避点,因为它在正则表达式中意味着“任何字符”。
>>> s1 = "A blah blah blah." # match A
... s2 = "Blah blah blah. A blah blah." # match A
... s3 = "Blah blah blah A." # don't match 'A'
>>> import re
>>> re.search("(^|\. )A", s1)
<_sre.SRE_Match object; span=(0, 1), match='A'>
>>> re.search("(^|\. )A", s2)
<_sre.SRE_Match object; span=(14, 17), match='. A'>
>>> re.search("(^|\. )A", s3)
如果您希望它使用更多标点符号,则可以使用字符类。然后你不必逃避。
>>> re.search("(^|[.!?]) A", 'Good? Ay.')
8: <_sre.SRE_Match object; span=(4, 7), match='? A'>
答案 1 :(得分:0)
编辑您可以执行以下操作:
>>> import re
>>> s1 = "A blah blah blah."
>>> s2 = "Blah blah blah. A blah blah."
>>> s3 = "Blah blah blah A."
>>> re.findall('(?:^\s*|[?!.]\s+)(A)',s1)
['A']
>>> re.findall('(?:^\s*|[?!.]\s+)(A)',s2)
['A']
>>> re.findall('(?:^\s*|[?!.]\s+)(A)',s3)
[]