我正在努力解决 python 中的正则表达式。我花了几个小时试图找出问题所在。 这是我的内容:
Some Title - Description (Gold Edition)
Some Title - Description
我需要匹配括号中的Some Title
和可选的Gold
单词。
我尝试过以下正则表达式 https://regex101.com/r/9MNYZl/1 :
(.*)\-.*(?:\((.*)[Ee]dition\))*?
但它没有捕获 Edition
之前的单词。
我在 PHP
上尝试过一件有趣的事情,它运行得很好。
我不知道出了什么问题,请帮忙解决问题。
非常感谢。
最佳答案
模式中的第一个 .*
将匹配直到字符串末尾,然后它将回溯以匹配 -
和第二个 .*
将再次匹配,直到字符串末尾。
由于模式 (?:\((.*)[Ee]dition\))*?
的这一部分是可选的,因此该模式位于字符串末尾就足够了。
您可以使用 negated character class带有可选的非捕获组。
要匹配左括号后的第一个单词,您可以匹配 1+ 个单词字符 \w+
或使用 \S+
进行更广泛的匹配
^([^-]+)-[^\()]+(?:\((\S+) [Ee]dition\))?
部分内容
^
字符串开头(
捕获组 1[^-]+
匹配除 - 之外的任意字符 1 次以上
)-
关闭组 1 并匹配 -[^()]+
匹配除(
或)之外的任意字符 1 次以上
(?:
非捕获组\(
匹配(
(\S+)
捕获组 2,匹配非空白字符 1 次以上[Ee]dition
匹配空格和 [eE]dition\)
匹配)
)?
关闭非捕获组并使其可选
要捕获第 2 组中版本之前的所有内容而不是单个单词:
^([^-]+)-[^()]+(?:\(([^()]+) [Ee]dition\))?
关于Python正则表达式可选组与捕获组不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59235565/