如何在遇到一个“字符”时强制regex停止并从头开始继续

2024-04-23 12:13:41 发布

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

import re
match = re.findall(r'(a)(?:.*?(b)|.*?)(?:.*?(c)|.*?)(d)?', 
'axxxbxd,axxbxxcd,axxxxxd,axcxxx')
print (match)

输出:[('a', 'b', 'c', 'd'), ('a', '', 'c', '')]

我希望输出如下:

[('a','b','','d'),('a','b','c','d'),('a','','','d'),('a','','c','')]

每个列表都以“a”开头,并分别用逗号分隔字符串中的4项。你知道吗


Tags: 字符串importre列表matchprint逗号findall
2条回答

如果您想从一个分隔的字符串中获得几个匹配项,可以先用分隔符拆分字符串并运行regex,或者用[^<YOUR_DELIMITING_CHARS>]替换.(注意必须转义的\^]-)。还要注意,您可以使用可选的非捕获组来消除模式中的冗余。你知道吗

注意,我假设abc是占位符,实际值可以是单个字符值和多字符值。你知道吗

import re
s = 'axxxbxd,axxbxxcd,axxxxxd,axcxxx'
r = r'(a)(?:.*?(b))?(?:.*?(c))?(d)?'
print([re.findall(r, x) for x in s.split(',')])
print ([re.findall(r, x) for x in re.split(r'\W', s)])

# => [('a', 'b', '', ''), ('a', 'b', 'c', 'd'), ('a', '', '', ''), ('a', '', 'c', '')]

参见Python demo。你知道吗

如果分隔符是非单词字符,请使用\W。你知道吗

import re
s = 'axxxbxd,axxbxxcd,axxxxxd,axcxxx'
r = r'(a)(?:.*?(b)|.*?)(?:.*?(c)|.*?)(d)?'
print([re.findall(r, x) for x in s.split(',')])
print ([re.findall(r, x) for x in re.split(r'\W', s)])
# => [[('a', 'b', '', '')], [('a', 'b', 'c', 'd')], [('a', '', '', '')], [('a', '', 'c', '')]]

参见Python demo

如果字符串可以包含换行符,则将re.DOTALL修饰符传递给re.findall调用。你知道吗

图案细节

  • (a)-第1组捕获a
  • (?:.*?(b))?-与以下序列匹配的可选非捕获组:
    • .*?-任何字符(如果不使用re.S/re.DOTALL修饰符,则不使用换行字符),出现次数为零或更多,但尽可能少
    • (b)-第2组:一个b
  • (?:.*?(c))?
    • .*?-任何字符(如果不使用re.S/re.DOTALL修饰符,则不使用换行字符),出现次数为零或更多,但尽可能少
    • (c)-第3组:一个c
  • (d)?-组4(可选):a d。你知道吗

考虑到关键序列a... b... c... d应该以严格的顺序匹配-使用直接的方法:

s = 'axxxbxd,xxbxxcxxd,xxbxxxd|axcxxx'   # extended example
result = []
for seq in re.split(r'\W', s):           # split by non-word character
    result.append([c if c in seq else '' for c in ('a','b','c','d')])

print(result)

输出:

[['a', 'b', '', 'd'], ['', 'b', 'c', 'd'], ['', 'b', '', 'd'], ['a', '', 'c', '']]

相关问题 更多 >