使用正则表达式

时间:2016-10-19 06:55:44

标签: python regex string

我是正则表达式的新手,但我希望匹配大约200万个字符串中的模式。 有三种形式的原始字符串如下所示:

EC-2A-07<EC-1D-10>
EC-2-07
T1-ZJF-4

除了-之外,我想获得三个子字符串部分,也就是说我想分别获得EC2A07。特别是,对于第一个字符串,我只想在<之前划分部分。

我尝试了.+[\d]\W但无法识别EC-2-07,然后我使用.split('-')拆分字符串,然后在返回的列表中使用index来获取我想要的内容。但效率很低。

你能想出一个高效的正则表达式来满足我的要求吗?非常感谢!

2 个答案:

答案 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)

你可以试试这个:

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

Explanation

Python Demo