正则表达式,表示字符串结束或继续使用特定字符

时间:2018-04-13 20:59:19

标签: python regex

如果字符串以"PR-\d+"开头,我想写一个匹配的正则表达式,但是字符串结束,或者下一个字符是连字符。因此,例如,以下内容将匹配:

PR-123
PR-123-foo

但以下不会:

PR-123a
PR-
PR-foo

我试过了re.match(r'PR-\d+[-$]', st),但那并没有奏效。看来这是在搜索文字的美元符号字符,而不是字符串的结尾。

我该如何写这个表达式?

3 个答案:

答案 0 :(得分:3)

你可以使用负前瞻和负字符类的双重否定:

re.match(r'PR-\d+(?![^-])', st)

用简单的英语:后面没有一个不是连字符的字符。

此描述处理两种情况:后跟连字符或后跟字符串结尾。

demo

答案 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+]*$"它有效,我测试了它

相关问题