Python 正则表达式匹配某些不在引号之间的字符
Python Regex matching certain characters that are not between quotes
我正在尝试从字符串中提取标记,以便这些标记满足特定条件。在我的特殊情况下,我想提取符号,例如 +、=、- 等
我创建了以下正则表达式:
reg = re.compile(r"[\{\}\(\)\[\]\.,;\+\-\*\/\&\|<>=~]")
然而,当我申请时:
reg.findall('x += "hello + world"')
它也匹配引号之间的+,所以它输出:
['+', '=', '+']
我的预期输出是:
['+', '=']
我的问题是,我该如何实现?有可能吗?我一直在网上冲浪,但只找到了如何匹配除双引号之外的所有内容。
我认为你可以做一件事,你可以限制一次
"
会出现它不会检查正则表达式,直到
再次出现
"
来了
首先,您不需要转义字符 class 中的每个特殊字符(撇开 [
和 ]
)。所以你最初的表达变成了……。喜欢:
[-\[\]{}().,;+*/&|<>=~]
现在第二个要求:匹配某些位置(并保留一些原样)。在这里,您可以使用较新的 regex
module and write (demo on regex101.com):
"[^"]+"(*SKIP)(*FAIL)|[-\[\]{}().,;+*/&|<>=~]
或者对旧的 re
模块和一些编程逻辑使用括号:
import re
rx = re.compile(r'"[^"]+"|([-\[\]{}().,;+*/&|<>=~])')
string = 'x += "hello + world"'
symbols = [match.group(1) for match in rx.finditer(string) if match.group(1)]
print(symbols)
两者都会产生
['+', '=']
这些方法遵循以下机制:
match_this_but_dont_save_it | (keep_this)
您可能想阅读有关 (*SKIP)(*FAIL)
here 的更多信息。
我正在尝试从字符串中提取标记,以便这些标记满足特定条件。在我的特殊情况下,我想提取符号,例如 +、=、- 等
我创建了以下正则表达式:
reg = re.compile(r"[\{\}\(\)\[\]\.,;\+\-\*\/\&\|<>=~]")
然而,当我申请时:
reg.findall('x += "hello + world"')
它也匹配引号之间的+,所以它输出:
['+', '=', '+']
我的预期输出是:
['+', '=']
我的问题是,我该如何实现?有可能吗?我一直在网上冲浪,但只找到了如何匹配除双引号之外的所有内容。
我认为你可以做一件事,你可以限制一次
"
会出现它不会检查正则表达式,直到
再次出现"
来了
首先,您不需要转义字符 class 中的每个特殊字符(撇开 [
和 ]
)。所以你最初的表达变成了……。喜欢:
[-\[\]{}().,;+*/&|<>=~]
现在第二个要求:匹配某些位置(并保留一些原样)。在这里,您可以使用较新的 regex
module and write (demo on regex101.com):
"[^"]+"(*SKIP)(*FAIL)|[-\[\]{}().,;+*/&|<>=~]
或者对旧的
re
模块和一些编程逻辑使用括号:
import re
rx = re.compile(r'"[^"]+"|([-\[\]{}().,;+*/&|<>=~])')
string = 'x += "hello + world"'
symbols = [match.group(1) for match in rx.finditer(string) if match.group(1)]
print(symbols)
两者都会产生
['+', '=']
这些方法遵循以下机制:
match_this_but_dont_save_it | (keep_this)
您可能想阅读有关 (*SKIP)(*FAIL)
here 的更多信息。