Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 表示字符串以特定字符结尾或继续的正则表达式_Python_Regex - Fatal编程技术网

Python 表示字符串以特定字符结尾或继续的正则表达式

Python 表示字符串以特定字符结尾或继续的正则表达式,python,regex,Python,Regex,我想编写一个正则表达式,如果字符串以PR-\d+开头,但字符串结束,或者下一个字符是连字符,则该正则表达式将匹配。因此,例如,以下内容将匹配: PR-123 PR-123-foo 但以下情况不会: PR-123a PR- PR-foo 我尝试了re.matchr'PR-\d+[-$]',st,但没有成功。这似乎是在搜索文字美元符号字符,而不是字符串的结尾 如何编写此表达式?字符类中的美元符号被解析为文字$char。你需要使用一个替代组,或者一个积极的前瞻 以下是包含非捕获组的版本: re.m

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

PR-123
PR-123-foo
但以下情况不会:

PR-123a
PR-
PR-foo
我尝试了re.matchr'PR-\d+[-$]',st,但没有成功。这似乎是在搜索文字美元符号字符,而不是字符串的结尾


如何编写此表达式?

字符类中的美元符号被解析为文字$char。你需要使用一个替代组,或者一个积极的前瞻

以下是包含非捕获组的版本:

re.match(r'PR-\d+(?:-|$)', st) 

积极的前瞻版本:

re.match(r'PR-\d+(?=-|$)', st)
或者使用与否定字符类相结合的相同工作的负前瞻解决方案,以避免交替并使模式更有效:

唯一的区别是这些正则表达式匹配返回的内容:非捕获组版本将实际返回-作为匹配值的一部分,而第二个版本将不包含-char。如果只是检查匹配项,则没有区别


仅供参考:re.match将只在字符串的开头查找匹配项,这就是为什么不需要在模式的开头使用^。否则,如果要使用re.search或其他非锚定方法,则必须使用与字符串开头匹配的“^”或“\A”锚定来预加模式。

rPR-\d+[-\w+]*$有效,我对其进行了测试

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

re.match(r'PR-\d+(?![^-])', st)
普通英语中:后面不跟非连字符的字符

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


也许,你需要看起来是那样的。继续并发布一个答案,我会接受我添加了一些变化和解释。请注意,带有否定字符类解决方案的负前瞻比带有交替的正前瞻更有效。也许您应该测试它?这不能正常工作。它允许在数字和字符串结尾之间包含任意数量的单词字符,使其与PR-123a等匹配。
re.match(r'PR-\d+(?![^-])', st)