我需要澄清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")
之后没有匹配的额外东西吗?
谢谢。
答案 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")