将存储在变量中的正则表达式与量词组合的正确语法是什么?

时间:2015-11-10 22:36:18

标签: python regex

我知道堆栈溢出中有很多关于在正则表达式中使用变量的问题,如果变量是一个单词,或者它只需要匹配一次,我就设法使它工作;但是,一旦我添加了特殊字符/空格和量词,我就无法匹配它。例如,我想将 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;

...我似乎无法正确地获得它的语法(我一直得到错误的条件)。我已经尝试过寻找答案,但我不确定如何让它正确识别量词。

2 个答案:

答案 0 :(得分:2)

您需要将这几个单词分组并添加可选的空格:

match = re.search(r"(?:\s*{0})IDEONE demo".format(re.escape(some_var)), should_match)

请参阅this is how it works

正则表达式看起来像(?:\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 ?>