gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:20:25 24 4
gpt4 key购买 nike

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

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() 来获取每一行,这显然会分解传递给正则表达式的行。我正在考虑重写它,但是关于这部分的任何建议也会非常有帮助。

最佳答案

这个经过测试的脚本应该可以解决问题:

import re
re_sq_long = r"""
# Match single quoted string with escaped stuff.
' # Opening literal quote
( # $1: Capture string contents
[^'\\]* # Zero or more non-', non-backslash
(?: # "unroll-the-loop"!
\\. # Allow escaped anything.
[^'\\]* # Zero or more non-', non-backslash
)* # Finish {(special normal*)*} construct.
) # End $1: String contents.
' # Closing literal quote
"""
re_sq_short = r"'([^'\\]*(?:\\.[^'\\]*)*)'"

data = r'''
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';'''
matches = re.findall(re_sq_long, data, re.DOTALL | re.VERBOSE)
menu_items = []
for match in matches:
match = re.sub('\s+', ' ', match) # Clean whitespace
match = re.sub(r'\\', '', match) # remove escapes
menu_items.append(match) # Add to menu list

print (menu_items)

这是正则表达式的简短版本:

'([^'\\]*(?:\\.[^'\\]*)*)'

此正则表达式使用 Jeffrey Friedl 的“unrolling-the-loop”效率技术进行了优化。 (参见:Mastering Regular Expressions (3rd Edition))了解详情。

请注意,上面的正则表达式等效于以下正则表达式(更常见但在大多数 NFA 正则表达式实现中要慢得多):

'((?:[^'\\]|\\.)*)'

关于Python 正则表达式匹配单引号中的文本,忽略转义引号(和制表符/换行符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5452655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com