我正在使用 python。
模式是:
re.compile(r'^(.+?)-?.*?\(.+?\)')
文本如下:
text1 = 'TVTP-S2(xxxx123123)'
text2 = 'TVTP(xxxx123123)'
我希望获得 TVTP
答案 0 :(得分:3)
匹配这些格式的另一个选项是:
^([^-()]+)(?:-[^()]*)?\([^()]*\)
说明
^
字符串开头([^-()]+)
捕获组1,匹配除-
(
和)
(?:-[^()]*)?
由于 -
被排除在第一部分之外,因此可以选择匹配 -
后跟除 (
和 )
之外的任何字符\([^()]*\)
匹配从 (
到 )
之间不匹配任何括号示例
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)
答案 3 :(得分:0)
这是因为第一个加号是懒惰的,后面的破折号是可选的,后面是一个允许任何字符的模式。
这允许正则表达式引擎为第一组选择单个字母 T(因为它很懒),选择将破折号解释为不存在,这是允许的,因为它后面是一个问号,然后有下一个 .* 匹配“VTP-S2”。
您可以只抓取非破折号进行捕获,然后是非括号直到括号。
p=re.compile(r'^([^-]*?)[^(]*\(.+?\)')
p.search('TVTP-S2(xxxx123123) blah()').group(1)
非括号部分阻止第二部分匹配 'S2(xxxx123123) blah(' 在我上面修改的示例中。