我正在尝试从字符串中提取标记,以使这些标记符合某些条件。在我的特定情况下,我想提取诸如+,=, - 等符号
我创建了以下正则表达式:
reg = re.compile(r"[\{\}\(\)\[\]\.,;\+\-\*\/\&\|<>=~]")
但是,当我申请时:
reg.findall('x += "hello + world"')
它也匹配引号之间的+,因此输出:
['+', '=', '+']
我的预期输出是:
['+', '=']
我的问题是,我该如何实现这一目标?它甚至可能吗?我一直在互联网上冲浪,但只发现如何匹配除了双引号之外的所有东西,以及类似的东西。
答案 0 :(得分:1)
首先,您不需要转义字符类中的每个特殊字符(放开[
和]
)。所以你的初始表达式变成了......像:
[-\[\]{}().,;+*/&|<>=~]
现在达到第二个要求:在某些位置匹配(并保留一些原样)。在这里,您可以使用较新的regex
模块并编写(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。
答案 1 :(得分:0)
我认为你可以做一件事你可以限制一次
&#34;
直到另一次出现
,它才会检查正则表达式&#34;
配