我是正则表达式的新手,但我希望匹配大约200万个字符串中的模式。 有三种形式的原始字符串如下所示:
EC-2A-07<EC-1D-10>
EC-2-07
T1-ZJF-4
除了-
之外,我想获得三个子字符串部分,也就是说我想分别获得EC
,2A
,07
。特别是,对于第一个字符串,我只想在<
之前划分部分。
我尝试了.+[\d]\W
但无法识别EC-2-07
,然后我使用.split('-')
拆分字符串,然后在返回的列表中使用index来获取我想要的内容。但效率很低。
你能想出一个高效的正则表达式来满足我的要求吗?非常感谢!
答案 0 :(得分:1)
您需要使用
^([A-Z0-9]{2})-([A-Z0-9]{1,3})-([A-Z0-9]{1,2})
请参阅regex demo
<强>详情:
^
- 字符串开头([A-Z0-9]{2})
- 第1组捕获2个大写ASCII字母或数字
- -
- 连字符([A-Z0-9]{1,3})
- 第2组捕获1到3个大写ASCII字母或数字-
- 连字符([A-Z0-9]{1,2})
- 第3组捕获1到2个大写ASCII字母或数字。您可以根据需要调整{min,max}
量词中的值。
示例Python demo:
import re
regex = r"^([A-Z0-9]{2})-([A-Z0-9]{1,3})-([A-Z0-9]{1,2})"
test_str = "EC-2A-07<EC-1D-10>\nEC-2-07\nT1-ZJF-4"
matches = re.findall(regex, test_str, re.MULTILINE)
print(matches)
#or with lines
lines = test_str.split('\n')
rx = re.compile("([A-Z0-9]{2})-([A-Z0-9]{1,3})-([A-Z0-9]{1,2})")
for line in lines:
m = rx.match(line)
if m:
print('{0} :: {1} :: {2}'.format(m.group(1), m.group(2), m.group(3)))
答案 1 :(得分:0)