我正在尝试根据定界符的位置拆分字符串(我正在尝试从 Fortran 代码中删除注释)。我可以在以下字符串中使用 !
进行拆分:
x = '''print "hi!" ! Remove me'''
pattern = '''(?:[^!"]|"[^"]*")+'''
y = re.search(pattern, x)
但是,如果字符串包含转义引号,则此操作失败,例如
z = '''print "h\"i!" ! Remove me'''
能否修改正则表达式以处理转义引号?或者我什至不应该使用正则表达式来解决这类问题?
最佳答案
这是一个经过验证的正则表达式(来自 Mastering Regular Expressions ),用于匹配可能包含反斜杠转义引号的双引号字符串文字:
r'"[^"\\]*(?:\\.[^"\\]*)*"'
在定界引号内,它会处理任何以反斜杠开头的字符对,而不会费心去识别第二个字符;这使得它可以毫不费力地处理转义的反斜杠和其他转义序列。在没有 possessive quantifiers 的情况下,它的效率也一样高和 atomic groups ,它们不受 Python 支持。
您的应用程序的完整正则表达式为:
r'^((?:[^!"]+|"[^"\\]*(?:\\.[^"\\]*)*")*)!.*$'
这只 匹配包含注释的行,并捕获第 1 组中注释之前的所有内容。对于 以 !
开始的行,捕获可能是零长度。此正则表达式适用于 sub
而不是 search
,如下所示:
import re
pattern = r'^((?:[^!"]+|"[^"\\]*(?:\\.[^"\\]*)*")*)!.*$'
x = '''print "hi!" ! Remove me'''
y = re.sub(pattern, r'\1', x)
print(y)
See it in action on ideone.com
免责声明:此答案与 FORTRAN 无关,仅与遵循问题中指定规则的代码有关。我从未使用过 FORTRAN,而且我在过去一小时左右找到的所有引用资料似乎都描述了一种完全不同的语言。嗯!
关于python - 使用python用分隔符分割字符串,同时忽略引号内的分隔符和转义引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5150398/