Python正则表达式可匹配单引号中的文本,而忽略转义的引号(和制表符/换行符)

发布于 2021-01-29 17:34:00

给定一个文本文件,我要匹配的字符用单引号分隔,但可能有零个或一个转义的单引号,以及零个或多个制表符和换行符(不转义)-我想匹配仅文字。例:

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()
来获取每一行,这显然正在破坏传递给正则表达式的行。我正在寻找重新编写它的方法,但是对此部分的任何建议也将非常有帮助。

关注者
0
被浏览
143
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    应该这样做:

    menu_item = '((?:[^'\\]|\\')*)'
    

    在此,该(?:[^'\\]|\\')*部分与除'\或文字之外的任何字符的任何序列匹配\'。前一个表达式[^'\\]确实允许换行符和制表符,然后您需要用单个空格替换它们。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看