这个正则表达式有什么问题?

3

我正在使用Python。
这个模式是:

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

像这样的文本:

text1 = 'TVTP-S2(xxxx123123)'

text2 = 'TVTP(xxxx123123)'

我希望获得TVTP


1
你怎么指望得到那个?你的代码剩下的在哪里? - smac89
由于“-”是可选的,因此第一组只会匹配第一个字母,因为它不贪婪,然后“.*?”将匹配直到“(”的所有内容。 - Barmar
2
使用 r'^[^(\s-]+' - anubhava
4个回答

3

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

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

解释

  • ^ 匹配字符串开始位置
  • ([^-()]+) 捕获 第一组,匹配除了 -() 之外的字符,匹配至少一次
  • (?:-[^()]*)? 因为第一部分已经排除了 - 字符,所以此处可选匹配 - 后面跟着任何除了 () 的字符
  • \([^()]*\) 匹配从 () 的内容,但中间不能包括小括号

正则表达式演示 | Python演示

示例

import re

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

输出

['TVTP', 'TVTP']

1
这个正则表达式有效:
pattern = r'^([^-]+).*\(.+?\)'
>>> re.findall(pattern, 'TVTP-S2(xxxx123123)')
['TVTP']
>>> re.findall(pattern, 'TVTP(xxxx123123)')
['TVTP']

0

0

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

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

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

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

非括号部分防止第二部分与我上面修改后的示例中的“S2(xxxx123123)blah(”匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接