如何用Python正则表达式匹配“以A开头或以B结尾”的模式?
r'(^|^A)(\S+)(B$|$)'
结果会匹配所有内容,实际上等同于 ^\S$。
怎么写一个可以匹配“以A开头或以B结尾,可能同时满足但不能都不满足”的表达式呢?
另外,我还需要在子字符串模块中引用组(\S+)。
举个例子:
匹配 Aanything
、anythingB
,并在替换时引用 anything
这个组。
6 个回答
2
这是我们想要的行为吗?
var rx = /^((?:A)?)(.*?)((?:B)?)$/;
"Aanything".match(rx)
> ["Aanything", "A", "anything", ""]
"anythingB".match(rx)
> ["anythingB", "", "anything", "B"]
"AanythingB".match(rx)
> ["AanythingB", "A", "anything", "B"]
"anything".match(rx)
> ["anything", "", "anything", ""]
"AanythingB".replace(rx, '$1nothing$3');
> "AnothingB"
"AanythingB".replace(rx, '$2');
> "anything"
4
(^A.*B$)|(^A.*$)|(^.*B$)
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
1
问题解决了。
我在Python中使用了这个正则表达式,找到了Python手册里的内容:
(?(id/name)yes-pattern|no-pattern)
这个表达式会尝试用yes-pattern进行匹配,如果指定的id或名称的组存在;如果不存在,则用no-pattern进行匹配。no-pattern是可选的,可以不写。例如, (<)?(\w+@\w+(?:.\w+)+)(?(1)>) 是一个不太好的邮箱匹配模式,它可以匹配空字符串和'user@host.com',但不能匹配其他格式的邮箱。这个功能在2.4版本中新增。
所以我的最终答案是:
r'(?P<prefix>A)?(?P<key>\S+)(?(prefix)|B)'
命令:
>>>re.sub(r'(?P<prefix>A)?(?P<key>\S+)(?(prefix)|B)','\g<key>',"Aanything")
'任何东西'
>>>re.sub(r'(?P<prefix>A)?(?P<key>\S+)(?(prefix)|B)','\g<key>',"anythingB")
'任何东西'
当 AanythingB
返回给我 anythingB
时,我也不在乎。
>>>re.sub(r'(?P<prefix>A)?(?P<key>\S+)(?(prefix)|B)','\g<key>',"AanythingB")
'anythingB'