在python中拆分(regex)



我确实得到了下面的字符串,我正在寻找一种方法来分割它,以便始终得到以下输出

'1GB 02060250396L7.067,702BE 129517720L6.633,403NL 134187650L3.824,234DE 165893440L3.111,005PL 65775644897L1.010,006DE 811506926L3.547,407AT U16235008L-830,008SE U57469158L3.001,30'
['1GB 02060250396L1.060,70',
'2BE 129517720L2.639,40',
'3NL 134187650L4.024,23',
'4DE 165893440L8.111,00',
'5PL 65775644897L3.010,00',
'6DE 811506926L3.547,40',
'7AT U16235008L-830,00',
'8SE U57469158L8.0221,30']

我目前的做法然而,re.split("([0-9][0-9][0-9][A-Z][A-Z])", input)也在拆分我的分隔符,除了我目前使用的分隔符之外,没有其他可能的分隔符可以保持一致。是否也可以分割我的分隔符并分配它的一部分";70〃;到前面的绳子和一部分";2BE";到下面的字符串?

使用re.findall()而不是re.split()

你想匹配

  • 一个数字d,后面跟
  • 两个字母[A-Z]{2},后跟
  • 一个空间s,后面跟
  • 一堆字符,直到遇到逗号[^,]+,,后跟
  • 两位d{2}

在regex101 上试用

那么做:

input_str = '1GB 02060250396L7.067,702BE 129517720L6.633,403NL 134187650L3.824,234DE 165893440L3.111,005PL 65775644897L1.010,006DE 811506926L3.547,407AT U16235008L-830,008SE U57469158L3.001,30'
re.findall(r"d[A-Z]{2}s[^,]+,d{2}", input_str)

这就产生了

['1GB 02060250396L7.067,70',
'2BE 129517720L6.633,40',
'3NL 134187650L3.824,23',
'4DE 165893440L3.111,00',
'5PL 65775644897L1.010,00',
'6DE 811506926L3.547,40',
'7AT U16235008L-830,00',
'8SE U57469158L3.001,30']

或者,如果您不想对您的模式如此具体,您可以简单地使用regex[^,]+,d{2}在regex101 上试用

这将匹配除逗号、单个逗号和两位数字之外的任意字符。

re.findall(r"[^,]+,d{2}", input_str)
# Output:
['1GB 02060250396L7.067,70',
'2BE 129517720L6.633,40',
'3NL 134187650L3.824,23',
'4DE 165893440L3.111,00',
'5PL 65775644897L1.010,00',
'6DE 811506926L3.547,40',
'7AT U16235008L-830,00',
'8SE U57469158L3.001,30']

是否也可以拆分我的分隔符并分配其中的一部分"70〃;到前面的绳子和一部分";2BE";到下面的字符串

如果您必须以任何价格使用re.split,那么您可以按照的方式利用零长度断言来执行此任务

import re
text = '1GB 02060250396L7.067,702BE 129517720L6.633,403NL 134187650L3.824,234DE 165893440L3.111,005PL 65775644897L1.010,006DE 811506926L3.547,407AT U16235008L-830,008SE U57469158L3.001,30'
parts = re.split(r'(?<=,[0-9][0-9])', text)
print(parts)

输出

['1GB 02060250396L7.067,70', '2BE 129517720L6.633,40', '3NL 134187650L3.824,23', '4DE 165893440L3.111,00', '5PL 65775644897L1.010,00', '6DE 811506926L3.547,40', '7AT U16235008L-830,00', '8SE U57469158L3.001,30', '']

说明:这个特殊的是正向查找,它确实找到了前面有,位数字的零长度子串。请注意,零件末尾有多余的空str