我使用regex模式来拆分一些字符串,根据管道作为分隔符。大多数字符串能够按照我的要求正确地拆分,但是有一种类型的字符串没有正确地拆分。
我正在考虑的定界符是管道,规则是,如果管道或其他特殊字符(如\ or“)在字符串中存在或以双引号括起来,则不应在该字符串中进行拆分。我使用的正则表达式模式如下:
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']但是,对于下面的输入字符串,这个regex没有像预期的那样拆分字符串。
text = r'2|dgx|abc|3'
print( re.split(pattern, text) )
# => ['2', 'dgx|abc', '3']与上述输出不同,我期望输出为“2”、“dgx”、“abc”、“3”。我是否可以通过修改当前用于上述输入字符串其余部分的正则表达式来实现这一点?
发布于 2022-11-23 17:33:53
可以使用一种提取方法
"\|"?(.*?)"(?=\|)|([^"|]+)见regex演示。详细信息
"\|"? - "|或"|"子字符串(.*?) -第1组:除行中断字符以外的任何零个或多个字符尽可能少" -a " char(?=\|) --一种正面的展望,它需要在右边立即使用|字符。| -或([^"|]+) -第2组:除"和|以外的任何一个或多个字符。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']https://stackoverflow.com/questions/74550840
复制相似问题