在 python 3 中使用正则表达式查找子字符串的最佳方法
best way to find substring using regex in 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 个 / 之后的第一个字符串,而值始终是键
之后的子字符串
尝试(?<!\S)[^\s/]*(?:/[^\s/]*){2}/([^\s/]*)
每个commnt尝试新的
(?<!\S)[^\s/]*(?:/[^\s/]*){2}/([^\s/]*)(?:/(\S*))?
其他人已经发布了各种正则表达式;一个更广泛的问题——这个问题最好用正则表达式解决吗?根据数据的整体格式化方式,使用
可能会更好地解析它
-
.split('/')
method on the string;或
csv.reader(..., delimiter='/')
或 csv.DictReader(..., delimiter='/')
在 csv 模块中。
根据您的描述"key is always the first string after 3rd / and value is always the substring after key",这里有几个解决方案。第一个使用 str.split
,maxsplit
为 4,将第四个 /
之后的所有内容收集到值中。第二个使用正则表达式提取两部分:
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
我试图找出使用 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 个 / 之后的第一个字符串,而值始终是键
之后的子字符串尝试(?<!\S)[^\s/]*(?:/[^\s/]*){2}/([^\s/]*)
每个commnt尝试新的
(?<!\S)[^\s/]*(?:/[^\s/]*){2}/([^\s/]*)(?:/(\S*))?
其他人已经发布了各种正则表达式;一个更广泛的问题——这个问题最好用正则表达式解决吗?根据数据的整体格式化方式,使用
可能会更好地解析它-
.split('/')
method on the string;或 csv.reader(..., delimiter='/')
或csv.DictReader(..., delimiter='/')
在 csv 模块中。
根据您的描述"key is always the first string after 3rd / and value is always the substring after key",这里有几个解决方案。第一个使用 str.split
,maxsplit
为 4,将第四个 /
之后的所有内容收集到值中。第二个使用正则表达式提取两部分:
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