regex 无法使用python中的正则表达式正确拆分字符串

vhmi4jdf  于 2022-11-26  发布在  Python
关注(0)|答案(1)|浏览(129)

我使用正则表达式模式来拆分一些字符串,以管道作为分隔符。大多数字符串都能按照我的要求正确拆分,但有一种类型的字符串不能正确拆分。
我考虑的分隔符是管道符,规则是如果管道符或其他特殊字符(如\或“)出现在字符串中或用双引号括起来,则不应在此处发生拆分。我使用的正则表达式模式是:

pattern = r'"?\|(?!(?:(?<=[A-Za-z]\|)|(?<=[A-Za-z]\\\|))(?=[a-zA-Z]))"?'

和一些输入字符串值如下所示,它正在按预期工作:

text = r'ced"|"ms|n"|4|98'
print( re.split(pattern, text) )
# => ['ced', 'ms|n', '4', '98']

text = r'ced"|"ms\|n"|4|98'
print( re.split(pattern, text) )
# => ['ced', 'ms\\|n', '4', '98']

text = r'2|dgx|3|abc'
print( re.split(pattern, text) )
# => ['2', 'dgx', '3', 'ksfh']

然而,对于下面的输入字符串,此正则表达式没有按预期拆分字符串。

text = r'2|dgx|abc|3'
print( re.split(pattern, text) )
# => ['2', 'dgx|abc', '3']

我希望输出是['2','dgx',' abc','3'],而不是上面的输出。有没有什么方法可以通过修改我目前用于上面其余输入字符串的正则表达式模式来实现这一点?

ffscu2ro

ffscu2ro1#

您可以使用以下提取方法

"\|"?(.*?)"(?=\|)|([^"|]+)

请参阅regex demo。* 详细数据 *:

  • "\|"?-"|"|"子字符串
  • (.*?)-组1:尽可能少的零个或多个除换行符以外的字符
  • 一个"字符
  • (?=\|)-需要紧接在右侧的|字符的正前瞻
  • |-或
  • ([^"|]+)-组2:除"|之外的任何一个或多个字符。

请参阅Python demo

import re
rx = re.compile(r'"\|"?(.*?)"(?=\|)|([^"|]+)')
texts = [r'ced"|"ms|n"|4|98',
    r'ced"|"ms\|n"|4|98',
    r'2|dgx|3|abc',
    r'2|dgx|abc|3']
for text in texts:
    print([f'{x}{y}' for x, y in rx.findall(text)])

输出量:

['ced', 'ms|n', '4', '98']
['ced', 'ms\\|n', '4', '98']
['2', 'dgx', '3', 'abc']
['2', 'dgx', 'abc', '3']

相关问题