:
if ($test =~ /^id\:(.*)$/ ) {
print $1;
}
答案 0 :(得分:15)
在Python中:
import re
test = 'id:foo'
match = re.search(r'^id:(.*)$', test)
if match:
print match.group(1)
在Python中,正则表达式可通过re
library。
字符串前面的r
表示它是raw string literal,这意味着不会特别处理反斜杠(否则每个反斜杠都需要使用另一个反斜杠进行转义,以便生成字面反斜杠它进入正则表达式字符串)。
我在这里使用了re.search
因为这是与Perl的=~
运算符最接近的等价物。还有另一个函数re.match
执行相同的操作,但只检查从字符串开头开始的匹配(与Perl程序员对“匹配”的定义相反)。有关两者之间差异的详细信息,请参阅this explanation。
另请注意,无需转义:
,因为它不是正则表达式中的特殊字符。
答案 1 :(得分:4)
match = re.match("^id:(.*)$", test)
if match:
print match.group(1)
答案 2 :(得分:0)
使用如下所述的RegexObject: http://docs.python.org/library/re.html#regular-expression-objects
答案 3 :(得分:0)
当我不得不将一堆Perl正则表达式(很多)重写为Python的re
包调用时,我将这个Perl写入Python正则表达式转换器。它涵盖了一些基本内容,但在许多方面可能仍然有用:
def convert_re (perl_re, string_var='column_name',
test_value=None, expected_test_result=None):
'''
Returns Python regular expression converted to calls of Python `re` library
'''
match = re.match(r"(\w+)/(.+)/(.*)/(\w*)", perl_re)
if not match:
raise ValueError("Not a Perl regex? "+ perl_re)
if not match.group(1)=='s':
raise ValueError("This function is only for `s` Perl regexpes (substitutes), i.e s/a/b/")
flags = match.group(4)
if 'g' in flags:
count=0 # all matches
flags=flags.replace('g','') # remove g
else:
count=1 # one exact match only
if not flags:
flags=0
# change any group references in replacements like \2 to group references like \g<2>
replacement=match.group(3)
replacement = re.sub(r"\$(\d+)", r"\\g<\1>", replacement)
python_code = "re.sub(r'{regexp}', r'{replacement}', {string}{count}{flags})".format(
regexp=match.group(2)
, replacement=replacement
, string=string_var
, count=", count={}".format(count) if count else ''
, flags=", flags={}".format(flags) if flags else ''
)
if test_value:
print("Testing Perl regular expression {} with value '{}':".format(perl_re, test_value))
print("(generated equivalent Python code: {} )".format(python_code))
exec('{}=r"{}"; test_result={}'.format(string_var, test_value, python_code))
assert test_result==expected_test_result, "produced={} expected={}".format(test_result, expected_test_result)
print("Test OK.")
return string_var+" = "+python_code
print convert_re(r"s/^[ 0-9-]+//", test_value=' 2323 col', expected_test_result='col')
print convert_re(r"s/[+-]/_/g", test_value='a-few+words', expected_test_result='a_few_words')