Python正则表达式可选组与捕获组不起作用

标签 python regex

我正在努力解决 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
    • \) 匹配 )
  • )? 关闭非捕获组并使其可选

Regex demo

要捕获第 2 组中版本之前的所有内容而不是单个单词:

^([^-]+)-[^()]+(?:\(([^()]+) [Ee]dition\))?

Regex demo

关于Python正则表达式可选组与捕获组不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59235565/

相关文章:

python - 匹配所有以s结尾的单词

regex - awk - 解析字段中具有相同字符作为分隔符的文本

regex - 使用正则表达式匹配多个逗号分隔的单词

javascript - 性能 - String.charAt(0) 与/^.{1}/

python - __import__ 从哪里获取别名?

python - 没有PIP的依赖python模块的离线安装

python - 使用 SWIG 将 C 结构数组访问到 Python

python - 在pygame<外星人入侵>中,为什么我的外星人只出现一排?

php - 如何从字符串中的特定文本和字符获取整数(正则表达式/PHP)

python - 计算一个数组中存在于另一个数组中的项目数?