如果字符串以"PR-\d+"
开头,我想写一个匹配的正则表达式,但是字符串结束,或者下一个字符是连字符。因此,例如,以下内容将匹配:
PR-123
PR-123-foo
但以下不会:
PR-123a
PR-
PR-foo
我试过了re.match(r'PR-\d+[-$]', st)
,但那并没有奏效。看来这是在搜索文字的美元符号字符,而不是字符串的结尾。
我该如何写这个表达式?
答案 0 :(得分:3)
你可以使用负前瞻和负字符类的双重否定:
re.match(r'PR-\d+(?![^-])', st)
用简单的英语:后面没有一个不是连字符的字符。
此描述处理两种情况:后跟连字符或后跟字符串结尾。
答案 1 :(得分:2)
字符类中的美元符号被解析为文字$
字符。你需要使用一个交替组或一个积极的前瞻。
以下是具有非捕获组的版本:
re.match(r'PR-\d+(?:-|$)', st)
请参阅regex demo。
一个积极的前瞻版本:
re.match(r'PR-\d+(?=-|$)', st)
或者相同工作的负向前瞻解决方案与否定的字符类相结合(以避免交替并使模式更高效):
re.match(r'PR-\d+(?![^-])', st)
唯一的区别是这些正则表达式匹配返回的内容:非捕获组版本实际上将返回-
作为匹配值的一部分,而第二个版本将不包含该-
个字符。如果您只是在检查比赛,则没有区别。
只有FYI:re.match
只会在字符串的开头查找匹配项,这就是为什么在模式开头不需要使用^
的原因。否则,如果您要使用re.search
或其他非锚定方法,则必须在模式前加上与{s}字符串开头匹配的^
或\A
个锚点。
答案 2 :(得分:-2)
r"PR-\d+[-\w+]*$"
它有效,我测试了它