Return下一个第n个结果全局连字符后\w+

Return the next nth result \w+ after a hyphen globally

刚刚进入理解正则表达式的下一阶段,希望社区能提供帮助...

字符串=These.Final.Hours-AUSVERSION.2013-TEST-TESTAGAIN-YIFY.cp(tt123456).MiLLENiUM.mp4

有多个测试名称前面有我从正则表达式派生的“-”连字符 \(?<=-)\w+\g

结果:

我可以使用正则表达式的贪婪分析最后的结果 \(?!.*-)(?<=-)\w+\g

结果:

你能帮我使用相同的字符串全局解析第一个、第二个或第三个结果吗?

在 Python 中,您可以使用简单的 -\s*(\w+) 正则表达式和 re.findall 获得这些匹配项,然后访问具有适当索引的任何匹配项:

IDEONE demo:

import re
s = 'These.Final.Hours-AUSVERSION.2013-TEST-TESTAGAIN-YIFY.cp(tt123456).MiLLENiUM.mp4'
r = re.findall(r'-\s*(\w+)', s)
print(r[0]) # => AUSVERSION
print(r[1]) # => TEST
print(r[2]) # => TESTAGAIN
print(r[3]) # => YIFY

-\s*(\w+) 模式搜索连字符,后跟 0+ 个空格,然后捕获 1+ 个数字、字母或下划线。 re.findall 仅 returns 使用捕获组捕获的文本,因此您只能获得使用 (\w+).

捕获的组 1 值

要一一得到这些匹配项,用re.search,可以用^(?:.*?-\s*(\w+)){n},其中n就是你想要的匹配索引。这里有一个regex demo.

A quick Python demo(在实际代码中,分配 re.search 的结果,并在检查是否匹配后才访问第 1 组值):

s = "These.Final.Hours-AUSVERSION.2013-TEST-TESTAGAIN- YIFY.cp(tt123456).MiLLENiUM.mp4"
print(re.search(r'^(?:.*?-\s*(\w+))', s).group(1))
print(re.search(r'^(?:.*?-\s*(\w+)){2}', s).group(1))
print(re.search(r'^(?:.*?-\s*(\w+)){3}', s).group(1))
print(re.search(r'^(?:.*?-\s*(\w+)){4}', s).group(1))

模式说明:

  • ^ - 字符串开头
  • (?:.*?-\s*(\w+)){2} - 匹配(此处)2 个序列的非捕获组:
    • .*? - 0+ 除换行符以外的任何字符(因为没有使用 re.DOTALL 修饰符)直到第一个...
    • - - 连字符
    • \s* - 0 个或更多空格
    • (\w+) - 第 1 组捕获 1 个以上的单词字符(字母、数字或下划线)。