我确实得到了下面的字符串,我正在寻找一种方法来分割它,以便始终得到以下输出
'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
。