给定一个文本文件,其中我想匹配的字符由单引号分隔,但可能有零个或一个转义单引号,以及零个或多个制表符和换行符(未转义)- 我只想匹配文本。 例如:
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
(http://docs.python.org/library/re.html#re.MULTILINE)来匹配多行,使用`$`来忽略/匹配换行符,以及使用`\s`(同样的链接)来匹配空格。前进吧,小草蜢 ;) - phoojimenu_item = 'Dave\'s lesser-known \n gyro';
并没有包含一个转义的单引号。这个字符串字面上包含了一个,但这只是为了帮助 Python 区分字符串结尾的引号。如果你想要真正包含转义单引号的测试用例,你需要像这样写:ohai = 'Dave\\\'s'
。 - phooji