在python中捕获模式

数据挖掘 Python
2021-10-01 01:43:17

我想使用python捕获以下模式 anyprefix-emp-<employee id>_id-<designation id>_sc-<scale id>

示例数据

strings = ["humanresourc-emp-001_id-01_sc-01","itoperation-emp-002_id-02_sc-12","Generalsection-emp-003_id-03_sc-10"]

预期输出:

[('emp-001', 'id-01', 'sc-01'), ('emp-002', 'id-02', 'sc-12'), ('emp-003', 'id-03', 'sc-10')]

我怎么能用python做到这一点。

3个回答

您也可以通过以下方式解决此问题;

import re
regex = re.compile("(emp-.+)_(id-.+)_(sc-.+)")
strings = ["humanresourc-emp-001_id-01_sc-01","itoperation-emp-002_id-02_sc-12","Generalsection-emp-003_id-03_sc-10"]
print([regex.findall(s)[0] for s in strings])

回答

[tuple(s[s.find("-") + 1:].split("_")) for s in strings]

解释

每个字符串都有一个很好的常规格式:

  1. 说明
  2. 员工编号
  3. 身份证号码
  4. 'sc' 号码(不知道可能是什么)

这些属性都用下划线分隔:_.

你的结果不需要描述,所以找到描述末尾的位置并删除它。我找到第一个连字符 ( -) 然后只保留之后的所有内容。

然后我将剩余字符串拆分为三个字符串,使用split("_").

这将返回您想要的三个部分,然后我将它们放入一个元组中。

我对strings.

你可以把它放在这样的函数中:

def extract_tags(strings):
    result = [tuple(s[s.find("-") + 1:].split("_")) for s in strings]
    return result

这是您的测试字符串的输出:

[('emp-001', 'id-01', 'sc-01'),
 ('emp-002', 'id-02', 'sc-12'),
 ('emp-003', 'id-03', 'sc-10')]

试试这个:

import re
strings = ["humanresourc-emp-001_id-01_sc-01","itoperation-emp-002_id-02_sc-12","Generalsection-emp-003_id-03_sc-10"]
new_list = []
pattern = '[a-zA-Z]+?[-]{1}(?P<empid>emp-[0-9]{3})_(?P<desid>id-[0-9]{2})_(?P<sclid>sc-[0-9]{2})'
for test_string in strings:
    m = re.search(pattern, test_string)
    new_tuple = tuple([m.group('empid'), m.group('desid'), m.group('sclid')])
    new_list.append(new_tuple)

不确定这是否能得到你想要的,但正则表达式模式适用于提供的数据。

这是我的输出:

[('emp-001', 'id-01', 'sc-01'), ('emp-002', 'id-02', 'sc-12'), ('emp-003', 'id-03', 'sc-10')]