regex 字符串中间的特定子字符串后的逗号分隔数字

tez616oj  于 2022-12-05  发布在  其他
关注(0)|答案(3)|浏览(175)

我需要在特定的子字符串后提取一个由逗号分隔的数字序列。当子字符串在字符串的开头时,它工作正常,但当它在中间时就不行了。
正则表达式'Port':\ .([0-9]+)可以很好地用于下面的示例,以获得值2
字符串示例:

{'Port': '2', 'Array': '[0, 0]', 'Field': '[2,2]', 'foo': '[0, 0]' , 'bar': '[9, 9]'}

但我需要获取字段值,我不在乎它是“[2,2]”还是2,2(字符串或数字)
我尝试了各种尝试与regex计算器,但无法找到一个解决方案返回的值后,字符串在中间的文本。任何想法?请帮助。谢谢前面,尼尔

ntjbwcob

ntjbwcob1#

我发现正则表达式是这样的,不确定这是否是你想要的:

import re

string = "{'Port': '2', 'Array': '[0, 0]', 'Field': '[2,2]', 'foo': '[0, 0]' , 'bar': '[9, 9]'}"

output = re.findall(r"\'Field\'\: \'\[([0-9]+)\,([0-9]+)\]\'",string)

print(output)

输出:

[('2', '2')]

如果要作为字符串:

output = str(output).replace('[','').replace(']','').replace('(','').replace(')','').replace(' ','').replace('\'','')
print(output)

输出:

2,2

编辑:
如果我得到了你想要的,这可能会工作,它将创建一个新的 Dataframe 与值只有一列称为'字段',然后你可以把它附加到自己的 Dataframe 。

values = []

def get_values(mdict, values):
    pattern = r"\'Field\'\: \'\[([0-9]+)\,([0-9]+)\]\'"
    output = re.findall(pattern,mdict)
    output = str(output).replace('[','').replace(']','').replace('(','').replace(')','').replace(' ','').replace('\'','')
    values.append(output)

# get_values(mdict, values)

for x in df['param']:
    get_values(str(x), values)

df_temp = pd.DataFrame(values, columns=['Field'])

df.append(df_temp)
ia2d9nvy

ia2d9nvy2#

这看起来像一个print()艾德的Python字典;你能用ast.literal_eval()把它放回字典里吗?

>>> import ast
>>> d = ast.literal_eval("""{'Port': '2', 'Array': '[0, 0]', 'Field': '[2,2]', 'foo': '[0, 0]' , 'bar': '[9, 9]'}""")
>>> d
{'Port': '2', 'Array': '[0, 0]', 'Field': '[2,2]', 'foo': '[0, 0]', 'bar': '[9, 9]'}
>>> d["Array"]
'[0, 0]'
j13ufse2

j13ufse23#

如果只需要2,2作为Field值,则可以使用单个捕获组。
请注意,您不必转义':,]

'Field':\s+'\[([0-9]+,\s*[0-9]+)]'
  • 'Field':逐字匹配
  • \s+'\[匹配1个以上的空白字符和[
  • (捕获组1
  • [0-9]+,\s*[0-9]+匹配1+位数,可选空格字符和1+位数
  • )关闭组1
  • ]'逐字匹配

请参阅regex demoPython demo
示例代码

import re

pattern = r"'Field':\s+'\[([0-9]+,[0-9]+)]'"

s = "{'Port': '2', 'Array': '[0, 0]', 'Field': '[2,2]', 'foo': '[0, 0]' , 'bar': '[9, 9]'}"

m = re.search(pattern, s)
if m:
    print(m.group(1))

输出量

2,2

如果要获取字段位于单引号之间的所有值,则仅当存在[时,才可以使用条件匹配]

'[^']+':\s+'(\[)?([0-9]+(?:,\s*[0-9]+)*)(?(1)\])'

Regex demo|Python demo
然后可以得到捕获组2的值。
示例:

import re

pattern = r"'[^']+':\s+'(\[)?([0-9]+(?:,\s*[0-9]+)*)(?(1)\])'"
s = "{'Port': '2', 'Array': '[0, 0]', 'Field': '[2,2]', 'foo': '[0, 0]' , 'bar': '[9, 9]'}"
matches = re.finditer(pattern, s)

for matchNum, match in enumerate(matches, start=1):
    print(match.group(2))

输出量

2
0, 0
2,2
0, 0
9, 9

相关问题