首页 > 解决方案 > 在 python 3 中使用正则表达式查找子字符串的最佳方法

问题描述

我试图找出使用re在键值对中查找特定子字符串的最佳方法:

some_string-variable_length/some_no_variable_digit/some_no1_variable_digit/some_string1/some_string2
eg: aba/101/11111/cde/xyz or aaa/111/1119/cde/xzx or ada/21111/5/cxe/yyz

这里一切都是可变的,我正在寻找的是键值对中的如下内容:

`cde: 2` as there are two entries for cde

cxe: 1 as there is only one cxe

注意:这里的一切都是可变的,除了/。即 cde 或 cxe 或某些字符串将恰好在两个/之后出现

input:aba/101/11111/cde/xyz/blabla
output: cde:xyz/blabla
input: aaa/111/1119/cde/xzx/blabla
output: cde:xzx/blabla
input: aahjdsga/11231/1119/gfts/sjhgdshg/blabla
output: gfts:sjhgdshg/blabla

如果您注意到这里,我的键始终是第 3 个/之后的第一个字符串,而值始终是键之后的子字符串

标签: pythonregexpython-3.7

解决方案


以下是基于您的描述的几个解决方案,即“key 始终是 3rd / 之后的第一个字符串,而 value 始终是 key 之后的子字符串”。第一个使用str.split4maxsplit将第四个之后的所有内容收集/到值中。第二个使用正则表达式提取两个部分:

inp = ['aba/101/11111/cde/xyz/blabla',
        'aaa/111/1119/cde/xzx/blabla',
        'aahjdsga/11231/1119/gfts/sjhgdshg/blabla'
        ]

for s in inp:
    parts = s.split('/', 4)
    key = parts[3]
    value = parts[4]
    print(f'{key}:{value}')

import re

for s in inp:
    m = re.match(r'^(?:[^/]*/){3}([^/]*)/(.*)$', s)
    if m is not None:
        key = m.group(1)
        value = m.group(2)
        print(f'{key}:{value}')

对于这两段代码,输出是

cde:xyz/blabla
cde:xzx/blabla
gfts:sjhgdshg/blabla

推荐阅读