我知道堆栈溢出中有很多关于在正则表达式中使用变量的问题,如果变量是一个单词,或者它只需要匹配一次,我就设法使它工作;但是,一旦我添加了特殊字符/空格和量词,我就无法匹配它。例如,我想将 some_var 中的任何内容与包含3个连续副本的任何字符串进行匹配。:
'(.*)'+re.escape(some_var){3}+'(.*)'
('(.*)'+re.escape(some_var)+'(.*)'){3}
'(.*)'+'re.escape(some_var){3}'+'(.*)'
're.escape(some_var){3}'
然而最后两行给出了语法错误,我已经尝试了
data have;
x = "A B C D E F E G H B I A B D J K";
run;
...我似乎无法正确地获得它的语法(我一直得到错误的条件)。我已经尝试过寻找答案,但我不确定如何让它正确识别量词。
答案 0 :(得分:2)
您需要将这几个单词分组并添加可选的空格:
match = re.search(r"(?:\s*{0})IDEONE demo".format(re.escape(some_var)), should_match)
正则表达式看起来像(?:\s*what\ what){3}
和{{3}}:它匹配3个序列
\s*
- 0个或更多空格后跟what\ what
- 文字what what
子字符串。答案 1 :(得分:1)
正则表达式模式只是字符串(任何非字母数字反斜杠都会转义以匹配文字字符串),因此您可以使用format
或%
运算符或连接来创建所需的模式字符串。
给定n
作为量词的某些值,在这种情况下为3,您需要适当地构造正则表达式字符串。 {3}
部分需要紧跟在re.escape(some_var)
之后的模式字符串中。
您可以使用%
运算符:
>>> n=3
>>> r'(?:\s*%s){%i}' % (re.escape(some_var), n)
'(?:\\s*what\\ what){3}'
或者,使用format
:
>>> r'(?:\s*{0}){>>> r'(?:\s*'+re.escape(some_var)+'){'+str(n)+'}'
'(?:\\s*what\\ what){3}'
}'.format(re.escape(some_var), n)
'(?:\\s*what\\ what){3}'
或者使用连接:
>>> re.match(r'(?:\s*%s){%i}' % (re.escape(some_var), n), should_match)
<_sre.SRE_Match object at 0x104244b28>
>>> re.match(r'(?:\s*%s){%i}' % (re.escape(some_var), n), not_a_match)
>>>
现在,这些字符串中的任何一个都可以正常运行:
<?php echo (($priceInt[0]-$specialInt[0])/$priceInt[0])*100 ?>