这样的正则表达式哪里错了?

时间:2021-01-12 06:25:47

标签: python regex

我正在使用 python。
模式是:

re.compile(r'^(.+?)-?.*?\(.+?\)')

文本如下:

text1 = 'TVTP-S2(xxxx123123)'

text2 = 'TVTP(xxxx123123)'

我希望获得 TVTP

4 个答案:

答案 0 :(得分:3)

匹配这些格式的另一个选项是:

^([^-()]+)(?:-[^()]*)?\([^()]*\)

说明

  • ^ 字符串开头
  • ([^-()]+) 捕获组1,匹配除- ()
  • 之外的任何字符1+次
  • (?:-[^()]*)? 由于 - 被排除在第一部分之外,因此可以选择匹配 - 后跟除 () 之外的任何字符
  • \([^()]*\) 匹配从 () 之间不匹配任何括号

Regex demo | Python demo

示例

import re

regex = r"^([^-()]+)(?:-[^()]*)?\([^()]*\)"
s = ("TVTP-S2(xxxx123123)\n"
    "TVTP(xxxx123123)\n")
    
print(re.findall(regex, s, re.MULTILINE))

输出

['TVTP', 'TVTP']

答案 1 :(得分:1)

这个正则表达式有效:

pattern = r'^([^-]+).*\(.+?\)'
>>> re.findall(pattern, 'TVTP-S2(xxxx123123)')
['TVTP']
>>> re.findall(pattern, 'TVTP(xxxx123123)')
['TVTP']

答案 2 :(得分:0)

一个快速的答案是

^(\w+)(-.*?)?\((.*?)\)$

https://regex101.com/r/wL4jKe/2/

答案 3 :(得分:0)

这是因为第一个加号是懒惰的,后面的破折号是可选的,后面是一个允许任何字符的模式。

这允许正则表达式引擎为第一组选择单个字母 T(因为它很懒),选择将破折号解释为不存在,这是允许的,因为它后面是一个问号,然后有下一个 .* 匹配“VTP-S2”。

您可以只抓取非破折号进行捕获,然后是非括号直到括号。

p=re.compile(r'^([^-]*?)[^(]*\(.+?\)')
p.search('TVTP-S2(xxxx123123) blah()').group(1)

非括号部分阻止第二部分匹配 'S2(xxxx123123) blah(' 在我上面修改的示例中。

相关问题