像这样的字符串的正则表达式

时间:2010-12-01 23:00:13

标签: python regex python-3.x

我需要匹配任何以:

开头的字符串
'/Engine

并以:

结束
ir_vrn'

我用过这个:

 vrn_page = re.compile('\'/Engine[a-zA-Z0-9._+-&/?:=]+ir_vrn\'')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/re.py", line 190, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.6/re.py", line 245, in _compile
    raise error, v # invalid expression
sre_constants.error: bad character range

但不适用于此字符串:

'/Engine/page/im/pop_mostra.php?P_=9078&P_Utentevisitatore=1702795&loto=http://s1.example.com/utloto/9/9078/Media/7df4164ecb81a5992280a1ce81120d05-3a5fa4377a23242690a273a82ea5d607&type=ir_vrn'

5 个答案:

答案 0 :(得分:4)

尝试:

  

/发动机。*?ir_vrn

注意问号。这确保了

  

/引擎和放大器; ^&放大器;的 ^&安培; 的^&安培;!ir_vrn @ $ @#$ @#ir_vrn @#@#

它只捕获

  

/引擎&安培; ^&安培; ^&安培; ^&安培; ir_vrn

而不是

  

/引擎&安培; ^&安培; ^&安培; ^&安培; ir_vrn @ $ @#$ @#ir_vrn

答案 1 :(得分:2)

为什么不^\'/Engine.*ir_vrn\'$

答案 2 :(得分:2)

它不起作用,因为你对中间部分的限制太多了。试试这个(.代表正则表达式中的“任何字符”):

\'/Engine.+?ir_vrn\'

此外,您可能希望锚定正则表达式,如果它只应匹配不仅包含此模式但完全符合指定的字符串。锚定的正则表达式将是这样的:

^\'/Engine.+ir_vrn\'$

答案 3 :(得分:2)

>>> import re
>>> regexp = "'/Engine.*ir_vrn'"
>>> re.match(regexp, "'/Engineir_vrn'")
<_sre.SRE_Match object at 0x101e2f9f0>
>>> re.match(regexp, "'/Engine/page/im/pop_mostra.php?P_=9078&P_Utentevisitatore=1702795&loto=http://s1.example.com/utloto/9/9078/Media/7df4164ecb81a5992280a1ce81120d05-3a5fa4377a23242690a273a82ea5d607&type=ir_vrn'")
<_sre.SRE_Match object at 0x101e2f988>
>>> 

答案 4 :(得分:0)

('\'/Engine[a-zA-Z0-9._+-&/?:=]+ir_vrn\'')存在问题,因为?:+-.在python正则表达式中具有特定含义。你逃脱了/,但没有逃脱失败的其他角色。

此外,您正在滥用字符范围:

[A-Za-z0-9]+将匹配一个或多个字母数字字符。 [a-zA-Z0-9.]在语法上是不正确的。 [a-zA-Z0-9\.]有效。由于您希望可打印的字符\S效果良好。

vrn_page = re.compile(r'\/Engine\S+ir_vrn')