我有两个字符串:
'''N678 N−12.,13.12.22,18.,19.,31.1.,9.2.,7. au 10.,13. au 17.,20.,21.,22.,28.
au 31.3.,6.,13.,19.,20.4.,5.,8.5.23'''
'''N678 à p. du 11.6.23 C+23.6.23 N−14.,24.7.23'''
字符串
我想这样分割:应用于第二个字符串:
['N678 à p. du 11.6.23 ', 'C+23.6.23 ', 'N−14.,24.7.23']
型
其概念是:每次你看到格式:any_character\s\d{1,2}.\d{1,2}.\d{2,4}\s[A-Z]拆分它。我用这个正则表达式做了最后一个例子:([A-Za-z].*?\d{1,2}\.\d{1,2}\.\d{2,4}\s*)
但它不适用于第一个,因为N678 N-12.会在Au附近分裂
`['N678 N−12.,13.12.22', 'au 10.,13. au 17.,20.,21.,22.,28.\nau 31.3.,6.,13.,19.,20.4.,5.,8.5.23']`
型
如果我删除可选的匹配问号,它将在第一个字符串中正常工作,但这将导致第二个字符串的结果不正确。
有什么想法吗?
3条答案
按热度按时间kyvafyod1#
将正则表达式更新为
字符串
这至少在给定的情况下是有效的。
型
输出量:
型
q8l4jmvw2#
你需要在一个look-ahead上分裂:
字符串
https://regex101.com/r/hoyJ9q/1
请注意,“N−14”中的“破折号”
−
不是标准破折号。JS参考示例:
型
zxlwwiss3#
如果你只想在第二个字符串中找到匹配,你可以匹配而不是分割。
字符串
模式匹配:
\b
防止部分字匹配的字边界[A-Z]
匹配一个大写字符A-Z(因为所有匹配似乎都以一开头).*?
匹配任何字符,尽可能少\d{1,2}\.\d{1,2}\.\d{2,4}
匹配您的“digits`模式(?=\s+[A-Z]|$)
正向预测,Assert1+空格字符,后跟右边的字符A-Z,或者Assert字符串的结尾。* (注意\s
也可以匹配换行符)*Regex demo|Python demo的
型
产出
型
注意,如果
.*?
后面没有直接跟\s+[A-Z]
,\d{1,2}\.\d{1,2}\.\d{2,4}
也可以匹配此格式如果你不想这样,你可以使用tempered greedy token:
型
Regex demo的