已阅读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'
答案 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']