【发布时间】:2011-03-27 21:42:04
【问题描述】:
给定一个文本文件,其中我要匹配的字符由单引号分隔,但可能有零个或一个转义单引号,以及零个或多个制表符和换行符(未转义) - 我只想匹配文本。示例:
menu_item = 'casserole';
menu_item = 'meat
loaf';
menu_item = 'Tony\'s magic pizza';
menu_item = 'hamburger';
menu_item = 'Dave\'s famous pizza';
menu_item = 'Dave\'s lesser-known
gyro';
我只想抓取文本(和空格),忽略制表符/换行符 - 我实际上并不关心转义的引号是否出现在结果中,只要它不影响匹配:
casserole
meat loaf
Tonys magic pizza
hamburger
Daves famous pizza
Dave\'s lesser-known gyro # quote is okay if necessary.
我已经设法创建了一个 几乎 可以做到的正则表达式 - 它处理转义的引号,但不处理换行符:
menuPat = r"menu_item = \'(.*)(\\\')?(\t|\n)*(.*)\'"
for line in inFP.readlines():
m = re.search(menuPat, line)
if m is not None:
print m.group()
那里肯定有大量的正则表达式问题 - 但大多数都在使用 Perl,如果有一个可以满足我的要求,我无法弄清楚 :) 因为我使用的是 Python,所以我不知道'不在乎它是否分布在多个组中,很容易重新组合它们。
一些答案说只使用解析文本的代码。虽然我确定我可以做到这一点 - 我非常接近有一个有效的正则表达式:)而且看起来它应该是可行。
更新:我刚刚意识到我正在使用 Python readlines() 来获取每一行,这显然会破坏传递给正则表达式的行。我正在考虑重写它,但任何关于这部分的建议也会非常有帮助。
【问题讨论】:
-
不是重复的 - 我也在尝试处理(非转义)换行符打破我的输入数据。
-
我同意,但我认为无论如何都值得指出。只需使用
re.MULTILINE(docs.python.org/library/re.html#re.MULTILINE) 匹配多行,$忽略/匹配尾行,使用\s(相同链接)匹配新空格。前进,蚱蜢;) -
附带说明:字符串
menu_item = 'Dave\'s lesser-known \n gyro';不包含转义的单引号。字符串文字包含一个,但这是为了帮助 Python 将其与字符串结尾的文字引号区分开来。如果你想要带有转义单引号的实际测试用例,你需要像ohai = 'Dave\\\'s'这样的东西。