python - 如何在模式匹配之前使用正则表达式将字符串拆分为多行
问题描述
我有一个包含以下格式的 swift 数据的文件,需要使用 python 中的正则表达式将其拆分为多行。原始文件:
ID Information
1 :20:Test1 :25:test2:28C:test3
期望的输出:
ID Information
1 :20:Test1
1 :25:test2
1 :28C:test3
使用记事本++,我可以使用将“信息”列分成多行
寻找: ^:[0-9]{2}:|\s:[0-9]{2}:|\s:[0-9]{2}[A-Za-z]{1}:
代替 : \n$0
需要使用 python 复制相同的内容。到目前为止,我尝试了以下代码,但结果不包含该模式。它在模式匹配后分裂:
import re
s = ':20:Test1 :25:test2:28C:test3'
l = re.compile('^:[0-9]{2}:|\s:[0-9]{2}:|\s:[0-9]{2}[A-Za-z]{1}:').split(s)
结果: ['', 'Test1 ', 'test2 ', 'test3']
拆分字符串时,结果还应包含正则表达式模式。
解决方案
您可以使用
import re
text = """ID Information
1 :20:Test1 :25:test2:28C:test3"""
valid_line_rx = r'^(\d+\s*)(:\d{2}[A-Za-z]?:.*)'
print( re.sub(valid_line_rx, lambda m:
"\n".join(["{}{}".format(m.group(1),x) for x in re.split(r'(?!^)(?=:\d{2}[A-Za-z]?:)', m.group(2))]),
text,
flags=re.M)
)
查看Python 演示,输出:
ID Information
1 :20:Test1
1 :25:test2
1 :28C:test3
正^(\d+\s*)(:\d{2}[A-Za-z]?:.*)
则表达式匹配
^
- 一行的开始(由于re.M
标志)(\d+\s*)
- 第 1 组:一个或多个数字,然后是 0 个或多个空格(:\d{2}[A-Za-z]?:.*)
- 第 2 组::
,两位数,一个可选字母和 aa:
,然后是尽可能多的除换行符以外的任何 0 个或多个字符。
正(?!^)(?=:\d{2}[A-Za-z]?:)
则表达式匹配一个不是字符串开头的位置,并且紧随其后的是:
、2 位数字、一个可选字母和 a :
,并且此模式用于拆分上述正则表达式匹配的 Group 2 值。
推荐阅读
- python - 在 cmd 中手动运行命令会产生与 Python 不同的结果
- typescript - TypeScript set string = null 失败,但是 null!作品
- javascript - 如何增加输入字段的值?
- python - SKLearn TypeError:得到了一个意外的关键字参数“as_frame”
- python - Discord 的公告频道
- javascript - 我正在尝试获取 div 中的按钮以及输入以仅将信息保存在本地存储中
- c# - 使用 NAudio 播放 IMA ADPCM 音频
- javascript - isPrime 函数 - 检查该 num 是否为素数 - Javascript
- python - 最大递归深度
- c++ - 游戏循环设计