使用python正则表达式从文件中的编号列表中获取内容

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (224)

我有以下行的文件:

lines.txt

1. robert
   smith
2. harry
3. john

我想得到如下数组:

["robert\nsmith","harry","john"]

我试过这样的事情:

with open('lines.txt') as fh:
    m = [re.match(r"^\d+\.(.*)",line) for line in fh.readlines()]
    print(m)
    for i in m:
        print(i.groups())

它输出如下:

[<_sre.SRE_Match object; span=(0, 9), match='1. robert'>, None, <_sre.SRE_Match object; span=(0, 8), match='2. harry'>, <_sre.SRE_Match object; span=(0, 7), match='3. john'>]
(' robert',)
Traceback (most recent call last):
  File "D:\workspaces\workspace6\PdfGenerator\PdfGenerator.py", line 5, in <module>
    print(i.groups())
AttributeError: 'NoneType' object has no attribute 'groups'

看来我正以非常错误的方式解决这个问题。你将如何解决这个问题?

提问于
用户回答回答于

你可以用re.split

正则表达式\n?\d+\.\s*

细节:

  • \n - 新队
  • ? - 匹配0到1次,匹配“新行”是否存在
  • \d+ - 在一次和无限次之间匹配一个数字(+)
  • \. - 点
  • \s*- 匹配[\r\n\t\f\v ]零和无限次之间的任何空白字符(等于)(*)

Python代码

re.split(r'\n?\d+\.\s*', lines)[1:]

[1:] 删除第一个项目,因为它的空字符串

输出:

['robert\n   smith', 'harry', 'john']
用户回答回答于

使用re.findall查找所有从\d\.\s+模式到下一个“\ n \ d”模式或高达结束

>>> import re
>>> re.findall(r'\d+\.\s+(.*?(?=\n\d|$))', text, flags=re.DOTALL)
['robert\n   smith', 'harry', 'john']

扫码关注云+社区

领取腾讯云代金券