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

Python 这样的正则表达式哪里错了?;,python,regex,Python,Regex,我正在使用python 模式是: re.compile(r'^(.+?)-?.*?\(.+?\)') 案文如下: text1 = 'TVTP-S2(xxxx123123)' text2 = 'TVTP(xxxx123123)' 我希望得到TVTP,这个正则表达式可以: pattern = r'^([^-]+).*\(.+?\)' >>> re.findall(pattern, 'TVTP-S2(xxxx123123)') ['TVTP'] >>> re.

我正在使用python
模式是:

re.compile(r'^(.+?)-?.*?\(.+?\)')
案文如下:

text1 = 'TVTP-S2(xxxx123123)'

text2 = 'TVTP(xxxx123123)'
我希望得到TVTP,这个正则表达式可以:

pattern = r'^([^-]+).*\(.+?\)'
>>> re.findall(pattern, 'TVTP-S2(xxxx123123)')
['TVTP']
>>> re.findall(pattern, 'TVTP(xxxx123123)')
['TVTP']
一个快速的答案是

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

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

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

您可以只抓取非破折号来捕获,然后抓取非破折号直到括号

p=re.compile(r'^([^-]*?)[^(]*\(.+?\))
p、 搜索('TVTP-S2(XX123123)blah()')。组(1)

非参数部分阻止第二部分匹配“S2(xxxx123123)blah”(“在我上面修改的示例中)。

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

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

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

范例

输出


您希望如何获得它?您的其余代码在哪里?因为
-
是可选的,第一组将只匹配第一个字母,因为它不是贪婪的,那么
*?
将匹配所有内容,直到
。使用
r'^[^(\s-]+')
import re

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