2024-04-29 15:22:12 发布
网友
假设我想搜索出现在行首或后跟“a”的“b”。
为什么re.match('[\^a]b','b')不匹配而re.match('^b','b')不匹配?
re.match('[\^a]b','b')
re.match('^b','b')
更新:我意识到我应该使用search,而不是match。我希望它对‘b’、‘cab’、‘ab’、‘bc’和‘abd’这样的东西是正面的。
search
match
你的第一个regex真的意味着:
[\^a]b # match a literal '^' or 'a', followed by a 'b'
你的第二个正则表达式:
^b # match start of line followed by a 'b'
对于第一个regex,您真正想要的是:
^b|ab # match start of line followed by a 'b', # OR # an 'a' followed by a 'b'
另请注意re.match()自动尝试从开头查找匹配项,如果要查找出现在字符串中间的字符串,则需要使用re.search()。
re.match()
re.search()
Say I want to search for a line start or 'a', or 'x', or '2' or '5' followed by a 'b'. Can't I do [^ax25]b instead of ^b|ab|xb|2b|5b?
[^ax25]b
^b|ab|xb|2b|5b
在这种情况下,我会:
(^|[ax25])b
character类只能包含个字符。插入符号(^)在字符类中作为匹配字符串开头的零宽度断言的特殊含义发生了变化:如果第一个字符是整个字符类的负数,或者如果转义或放在其他位置,则表示文字插入符号(^)。
^
正则表达式[\^a]b将匹配ab或^b,因此它不应匹配字符串'b'。
[\^a]b
ab
^b
'b'
请注意,re.match()只匹配字符串的开头,这就好像在regex的开头有一个字符串的开头锚(^或\A启用了多行选项)。
\A
因此“若要搜索出现在行首或后跟“a”的“b”,需要将re.search()与以下正则表达式一起使用:
(^|a)b
注意,我对这一点的解释与其他答案略有不同,我认为您的需求意味着您希望匹配'bob'中的“b”和'taboo'中的ab,因此行的起始需求仅适用于b,而不是a。
'bob'
'taboo'
b
a
与^b|ab相比,组中的这种交替方法为您提供了一个更具可伸缩性的解决方案,因此要在字符串开头或前面加上a、x、2或5来匹配b,您可以使用以下方法:
^b|ab
x
2
5
你的第一个regex真的意味着:
你的第二个正则表达式:
对于第一个regex,您真正想要的是:
另请注意
re.match()
自动尝试从开头查找匹配项,如果要查找出现在字符串中间的字符串,则需要使用re.search()
。在这种情况下,我会:
character类只能包含个字符。插入符号(
^
)在字符类中作为匹配字符串开头的零宽度断言的特殊含义发生了变化:如果第一个字符是整个字符类的负数,或者如果转义或放在其他位置,则表示文字插入符号(^
)。正则表达式
[\^a]b
将匹配ab
或^b
,因此它不应匹配字符串'b'
。请注意,
re.match()
只匹配字符串的开头,这就好像在regex的开头有一个字符串的开头锚(^
或\A
启用了多行选项)。因此“若要搜索出现在行首或后跟“a”的“b”,需要将
re.search()
与以下正则表达式一起使用:注意,我对这一点的解释与其他答案略有不同,我认为您的需求意味着您希望匹配
'bob'
中的“b”和'taboo'
中的ab
,因此行的起始需求仅适用于b
,而不是a
。与
^b|ab
相比,组中的这种交替方法为您提供了一个更具可伸缩性的解决方案,因此要在字符串开头或前面加上a
、x
、2
或5
来匹配b
,您可以使用以下方法:相关问题 更多 >
编程相关推荐