我有一个格式如下的文件:
hello = {
a = "2354a"
b = "06567567h"
}
goodbye = {
there = "/home/afhge"
}
...
anotherset = {
dsfsdf = grhbrwecs
dfgtmyj = 12345
}
我在python中使用正则表达式,我想要匹配的是大括号内的所有内容,因此得到的匹配输出将是以下列表:
['\n\n\ta = "2345a"\n\tb = "06567567h"\n\n\n', '\n\there = "/home/afhge"\n\n', '\n\tdsfsdf = grhbrwecs\n\tdfgtmyj = 12345\n\n']
我试过了正则表达式:
desired_output = re.findall("{[^}]", file_text)
然而这个正则表达式导致列表:
['{\n', '{\n', '{\n', '{\n', '{\n']
看起来[^}]匹配任何字符直到换行符。我试过了:
desired_output = re.findall("{[^}]", file_text, re.S)
和
desired_output = re.findall("{[^}]", file_text, re.M)
没有成功:(。
谢谢!
答案 0 :(得分:8)
没有你的角色类是对的。它将匹配任何不是}
的字符(甚至换行符)。问题是[^}]
只匹配一个字符。只需使用重复量词(你应该逃避{
):
r"\{[^}]*"
关于您尝试过的选项。如果有任何re.S
会有所帮助,因为没有它.
与换行符不匹配。但是.
实际上是唯一受re.S
影响的事情。另一个选项re.M
与之无关。这只会使锚点^
和$
在行的开头和结尾处匹配。
此外,由于您只需要括号内的内容,因此您无需匹配{
本身,但您可以使用lookbehind:
r"(?<=\{)[^}]*"
这不包括匹配中的{
。
答案 1 :(得分:2)
您应该使用(?<={).*?(?=})
您的正则表达式缺失 }
指定匹配结束位置,.*?
匹配0到多个字符,直到匹配第一个}