python正则表达式,剪切多行

时间:2012-01-14 17:50:52

标签: python regex

已阅读re.M,但仍然不知道如何实现这一目标(以合理的方式)

源字符串是:

'ClassId=A1\n    classname=A1\n   \nClassId=B1\n    classname=B1\n '

问题是如何将其拆分为以下两个元素列表:

targe[0]='ClassId=A1\n    classname=A1'
targe[1]='ClassId=B1\n    classname=B1'

4 个答案:

答案 0 :(得分:1)

re.M可能不会按照您的想法行事。请参阅docs。您可能正在寻找re.S (re.DOTALL),但在这种情况下您也不需要:

import re

string = 'ClassId=A1\n    classname=A1\n   \nClassId=B1\n    classname=B1\n '

regex = re.compile('ClassId=\w+\n    classname=\w+')

matches = regex.findall(string)

答案 1 :(得分:1)

也许你可以使用:

>>> import re
>>> s = 'ClassId=A1\n    classname=A1\n   \nClassId=B1\n    classname=B1\n '
>>> re.findall('ClassId=(.*)\n    classname=(.*)', s)         
[('A1', 'A1'), ('B1', 'B1')]

这找到我认为可以改变的两个字段。简单地将换行符放入正则表达式就可以了。

您提到re.M - 当您希望^$匹配字符串中的每一行时,使用该标志,而不仅仅是在字符串的开头和结尾。这里不需要,因为你可以把换行符放到你的模式中。

答案 2 :(得分:1)

拆分两个由一个或多个空格分隔的换行符, 然后去掉尾随空格。

>>> import re
>>> target=[p.rstrip() for p in re.split('\n +\n', 'ClassId=A1\n    classname=A1\n   \nClassId=B1\n    classname=B1\n ')]
>>> target[0]
'ClassId=A1\n    classname=A1'
>>> target[1]
'ClassId=B1\n    classname=B1'
>>>

答案 3 :(得分:1)

您使用re.M走在正确的轨道上,因为它可以让您充分利用^$

这是实现目标的一种可能方式:

>>> import re
>>>
>>> s = 'ClassId=A1\n    classname=A1\n   \nClassId=B1\n    classname=B1\n '
>>> r = re.compile(r'^ClassId=.*$\s*classname=.*$', re.M)
>>> r.findall(s)
['ClassId=A1\n    classname=A1', 'ClassId=B1\n    classname=B1']

<强>更新

下面是一个更通用的解决方案,它将文本拆分为以ClassId行开头的行块。

import re, pprint

s = """\
ClassId=123
    classname=1
    superclass=3
    InstanceId=4
    classname=5
    Caption=6
ClassId=A123
    classname=A1
    superclass=A3
InstanceId=A4
    classname=A5
    Caption=A6
ClassId=B999
ClassId=
ClassId=A123 classname=A1
superclass=A3
"""

r = re.compile(r'^ClassId=.*?(?:(?=^ClassId=)|\Z)', re.M | re.S)

pprint.pprint(r.findall(s))

输出:

['ClassId=123\n    classname=1\n    superclass=3\n    InstanceId=4\n    classname=5\n    Caption=6\n',
 'ClassId=A123\n    classname=A1\n    superclass=A3\nInstanceId=A4\n    classname=A5\n    Caption=A6\n',
 'ClassId=B999\n',
 'ClassId=\n',
 'ClassId=A123 classname=A1\nsuperclass=A3\n']