我正在使用Python。
这个模式是:
re.compile(r'^(.+?)-?.*?\(.+?\)')
像这样的文本:
text1 = 'TVTP-S2(xxxx123123)'
text2 = 'TVTP(xxxx123123)'
我希望获得TVTP
另一个匹配这些格式的选项是:
^([^-()]+)(?:-[^()]*)?\([^()]*\)
解释
^
匹配字符串开始位置([^-()]+)
捕获 第一组,匹配除了 -
、(
和 )
之外的字符,匹配至少一次(?:-[^()]*)?
因为第一部分已经排除了 -
字符,所以此处可选匹配 -
后面跟着任何除了 (
和 )
的字符\([^()]*\)
匹配从 (
到 )
的内容,但中间不能包括小括号示例
import re
regex = r"^([^-()]+)(?:-[^()]*)?\([^()]*\)"
s = ("TVTP-S2(xxxx123123)\n"
"TVTP(xxxx123123)\n")
print(re.findall(regex, s, re.MULTILINE))
输出
['TVTP', 'TVTP']
pattern = r'^([^-]+).*\(.+?\)'
>>> re.findall(pattern, 'TVTP-S2(xxxx123123)')
['TVTP']
>>> re.findall(pattern, 'TVTP(xxxx123123)')
['TVTP']
这是因为第一个加号是懒惰的,后面的破折号是可选的,接着是一个允许任何字符的模式。
这使得正则表达式引擎选择第一组的单个字母T(因为它是懒惰的),选择将破折号解释为不存在,这是允许的,因为它后面跟着一个问号,然后让下一个.*匹配“VTP-S2”。
您可以只捕获非破折号以进行捕获,然后捕获非括号直到括号。
p=re.compile(r'^([^-]*?)[^(]*\(.+?\)')
p.search('TVTP-S2(xxxx123123) blah()').group(1)
非括号部分防止第二部分与我上面修改后的示例中的“S2(xxxx123123)blah(”匹配。
r'^[^(\s-]+'
。 - anubhava