首页 > 解决方案 > 如何在模式匹配之前使用正则表达式将字符串拆分为多行

问题描述

我有一个包含以下格式的 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']

拆分字符串时,结果还应包含正则表达式模式。

标签: pythonregex

解决方案


您可以使用

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 值。


推荐阅读