2

代码迭代 #2

stringVar = r'string'通过使用效果很好将 var1 更改为原始字符串。使用下面的代码,我现在得到了一个例外:

Traceback (most recent call last):
  File "regex_test.py", line 8, in <module>
    pattern = re.compile(var2 + "(.*)")
  File "/usr/lib/python2.7/re.py", line 190, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.7/re.py", line 242, in _compile
    raise error, v # invalid expression
sre_constants.error: unbalanced parenthesis

--

#!/usr/bin/python

import re

var1 = r'\\some\String\to\Match'
var2 = '\\\\some\\String\\'

pattern = re.compile(var2 + "(.*)")
found = pattern.match(var1, re.IGNORECASE)

if found:
    print "YES"
else:
    print "NO"

我试图在我的正则表达式中包含一个变量。这个问题与另一个问题有关,但通过使用编译模式与匹配中的变量略有不同。根据我读过的所有内容,下面的示例代码应该可以工作。

#!/usr/bin/python

import re

var1 = re.escape('\\some\String\to\Match') # A windows network share
var2 = "\\\\some\\String\\"

print var1 # Prints \\some\\String\ o\\Match
print var2 # Prints \\some\String\

pattern = re.compile(var2)
found = pattern.match(var1 + "(.*)", re.IGNORECASE)

if found:
    print "YES"
else:
    print "NO"

当我打印出我的变量时,我看到了一些奇怪的行为。我认为 re.escape 会在字符串中转义所有需要的字符。

当我在 Ubuntu 12.4.1 上执行 Python 2.7 中的代码时,出现以下异常

Traceback (most recent call last):
  File "regex_test.py", line 11, in <module>
    pattern = re.compile(var2)
  File "/usr/lib/python2.7/re.py", line 190, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.7/re.py", line 242, in _compile
    raise error, v # invalid expression
sre_constants.error: bogus escape (end of line)

我错过了什么导致异常被抛出?

4

3 回答 3

4

Python\t单个字符。您可能想使用r''(您可以谷歌“原始字符串”以了解更多信息)来避免该问题。

角色也是如此\

为了证明这一点,re.escape请在输入字符串之前尝试在其中打印字符串。这应该是有道理的。

这就是你要找的:

var1 = re.escape(r'\\some\String\to\Match')
于 2012-10-22T20:26:30.693 回答
2

re.escape用于转义字符串以用作正则表达式,但您转义var1然后var2用作正则表达式。

我认为以下是您要完成的工作:

var1 = r'\\some\String\to\Match'
var2 = re.escape('\\\\some\\String\\')
pattern = re.compile(var2 + '(.*)', re.IGNORECASE)
found = pattern.match(var1)

请注意,这r'\\some\String\to\Match'是一个原始字符串文字,但您不能使用它,var2因为它需要以反斜杠结尾。

于 2012-10-22T20:30:26.340 回答
0

re.escape在这种情况下不会让你的生活更轻松:

In [68]: re.escape('\\\\some\\String\\')
Out[68]: '\\\\\\\\some\\\\String\\\\'

In [71]: re.escape(r'\\some\String\to\Match')

Out[71]: '\\\\\\\\some\\\\String\\\\to\\\\Match'

显然,那里有太多的反斜杠。

可以仅使用原始字符串来执行此操作:

In [62]: import re

In [63]: re.match(r'\\\\some\\String\\(.*)', r'\\some\String\to\Match').group(1)
Out[63]: 'to\\Match'
于 2012-10-22T20:34:05.480 回答