Python Regex提取多个复杂组

2024-05-23 17:25:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从文本中提取一些数据组,并验证输入文本是否正确。在简化形式中,我的输入文本如下所示:

Sample=A,B;C,D;E,F;G,H;I&other_text

我感兴趣的是把它们提取出来。你知道吗

在泛型形式中,示例如下所示:

val11,val12;val21,val22;...;valn1,valn2;final_val

任意数量的逗号分隔对,用分号分隔,最后只有一个值。 在最终值之前必须至少有两对。你知道吗

我想到的正则表达式是这样的:

r'Sample=(\w),(\w);(\w),(\w);((\w),(\w);)*(\w)'

假设我想要的组仅仅是单词(实际上它们更复杂,但这超出了问题的范围)。 它实际上捕获了整个文本,但无法正确地对值进行分组。你知道吗


Tags: 数据sampletext文本示例感兴趣形式泛型
3条回答

您可以使用一个包含OR的regex来决定要解析哪种数据。我把正则表达式隔开,以便注释和清晰。你知道吗

data = 'val11,val12;val21,val22;valn1,valn2;final_val'

pat = re.compile(r'''
    (?P<pair>  # either comma separated ending in semicolon
        (?P<entry_1>[^,;]+)  ,  (?P<entry_2>[^,;]+)  ;
    )
    | # OR
    (?P<end_part>  # the ending token which contains no comma or semicolon
        [^;,]+
    )''', re.VERBOSE)

results = []
for match in pat.finditer(data):
    if match.group('pair'):
        results.append(match.group('entry_1', 'entry_2'))
    elif match.group('end_part'):
        results.append(match.group('end_part'))

print(results)

这将导致:

[('val11', 'val12'), ('val21', 'val22'), ('valn1', 'valn2'), 'final_val']

您可以不使用regex,通过使用字符串。拆分. 你知道吗

举个例子:

words = map(lambda x : x.split(','), 'val11,val12;val21,val22;valn1,valn2;final_val'.split(';'))

这将产生以下列表:

[
 ['val11', 'val12'],
 ['val21', 'val22'],
 ['valn1', 'valn2'],
 ['final_val']
]

我只是假设您的“值”是由除,;之外的任何字符组成的,即[^,;]+。这显然需要在re.matchre.finditer调用中进行修改,以满足您的实际需求。你知道吗

import re

s = 'Sample=val11,val12;val21,val22;val31,val32;valn1,valn2;final_val'

# verify if there is a match:
m = re.match(r'^Sample=([^,;]+),+([^,;]+)(;([^,;]+),+([^,;]+))+;([^,;]+)$', s)
if m:
    final_val = m.group(6)
    other_vals = [(m.group(1), m.group(2)) for m in re.finditer(r'([^,;]+),+([^,;]+)', s[7:])]
    print(final_val)
    print(other_vals)

印刷品:

final_val
[('val11', 'val12'), ('val21', 'val22'), ('val31', 'val32'), ('valn1', 'valn2')]

相关问题 更多 >