如何用Python正则表达式匹配“以A开头或以B结尾”的模式?

4 投票
6 回答
10844 浏览
提问于 2025-04-16 05:40
r'(^|^A)(\S+)(B$|$)'

结果会匹配所有内容,实际上等同于 ^\S$。

怎么写一个可以匹配“以A开头或以B结尾,可能同时满足但不能都不满足”的表达式呢?

另外,我还需要在子字符串模块中引用组(\S+)。

举个例子:

匹配 AanythinganythingB,并在替换时引用 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'

撰写回答