python- re.findall如何将内容分成组

时间:2015-01-02 17:16:23

标签: python regex python-2.7

我需要澄清re.findall方法的正则表达式是如何工作的。

pattern = re.compile(r'(?<=\\\\\[-16pt]\n)([\s\S]*?)(?=\\\\\n\\thinhline)')
content= ' '.join(re.findall(pattern, content))

所以上面打印出模式匹配的所有内容,起始是:\\[-16pt],结尾是'\ \ n,thinhline'加上后面的所有文本。 如果我有以下与模式匹配的内容:

\\[-16pt]
x = 10
print ("hi")
\\
\thinhline
\\[-16pt]
y = 3
print ("bye")
\\
\thinhline
\\[-16pt]
z = 7
print ("zap")
\\
\thinhline
This is random text.
All of this is matched by re.findall, even though it is not included within the pattern.
xyz = "xyz"

我如何将每个组分开,以便我可以,例如,并能够独立编辑它们:

第1组:

x = 10
print ("hi")

第2组:

y = 3
print ("bye")

第3组:

z = 7
print ("zap")

之后没有匹配的额外东西吗?

谢谢。

3 个答案:

答案 0 :(得分:1)

import re
s=re.findall(r"(?<=\\\\\[-16pt]\n)([\s\S]*?)(?=\\\\\n\\thinhline)",test_str)

Findall返回匹配的组列表。

此处s是一个列表。您可以通过引用s[0]s[1]来访问您想要的内容。

答案 1 :(得分:1)

考虑以下可运行程序:

import re

content="""\\[-16pt]
x = 10
print ("hi")
\\
thinhline
\\[-16pt]
y = 3
print ("bye")
\\
thinhline
\\[-16pt]
z = 7
print ("zap")
\\
thinhline
This is random text.
"""

pattern = re.compile(r"""(\\\[-16pt]\n)    # Start. Don't technically need to capture.
                         (.*?)             # What we want. Must capture ;)
                         (\n\\\nthinhline) # End. Also don't really need to capture
                      """, re.X | re.DOTALL)

for m in pattern.finditer(content):
    print("Matched:\n----\n%s\n----\n" % m.group(2))

运行时输出:

Matched:
----
x = 10
print ("hi")
----

Matched:
----
y = 3
print ("bye")
----

Matched:
----
z = 7
print ("zap")
----

注意:

  • 通过使用re.X选项,表达式可以是多行并注释
  • 通过使用re.DOTALL选项,可以删除过多的反斜杠 和#34; .*?&#34;小组(即&#34;让每个角色非贪婪地直到... 下一场比赛&#34;)将包括换行符。
  • 我使用了finditer而不是findall ......技术上已经离开了 从你的问题,但你想与每场比赛合作,所以我想到了 是一个很好的方法。
  • 我从\t取消了thinhline标签,因为我不确定它是否是{{1}} 意味着是一个tab char或者一个反弹 - 然后是t。这不会影响上面的内容 但只是想清楚。
  • 我只捕获开始和结束组以进行演示。只有中间 小组真的需要。

答案 2 :(得分:0)

使用 re.findall

pattern=r"""(\\\[-16pt])(\n[a-z]+\s+\={1}\s+[0-9]+)(\nprint\s+\({1}\"[a-z]+\"\){1})\n(\\\nthinhline)\n"""
result=re.findall(pattern,content)
count=1
for item in result:
    print("row",count,item[2])
    count+=1

输出:

row 1 
print ("hi")
row 2 
print ("bye")
row 3 
print ("zap")