-2

我需要一个正则表达式来检测字符'a',后跟一个空格,后跟一个单词,或者用引号括起来的单词。我需要使用这个或多个单词,并在替换中使用它们,例如“b \1”

所以:

a "foo bar"
a 'foo bar'
a foo
a 
a foo bar

应该变成:

b foo bar
b foo bar
b foo
a 
a foo

我需要什么正则表达式?

4

2 回答 2

0

如果引号中不允许使用引号,则可以使用以下方法:

perl -pe 's/^a (['\''"]?)(.+)\1$/b $2/' <<EOT
a "foo bar"
a 'foo bar'
a foo
a
EOT

输出

b foo bar
b foo bar
b foo
a

但也适用于a foo bar(a 替换为 b)。可以吗?它与 不匹配a ""

于 2013-04-10T22:29:35.447 回答
0

尝试:

a ('(.+)'|"(.+)"|(\B+))

替换为:

b $2$3$4

是的,奇怪的是 Python 似乎不喜欢空的捕获组。据我所知,大多数正则表达式实现都没有问题。不过,您始终可以分两步执行此操作:

temp = re.sub(r"a (['\"])(.*)\1",r"b \2", string)
return re.sub(r"a (\w*)",r"b \1", temp)

或者三个:

temp = re.sub(r"a (\"(.*)\"",r"b \1", string)
temp = re.sub(r"a ('(.*)'",r"b \1", temp)
return re.sub(r"a (\w*)",r"b \1", temp)

您也可以放弃使用sub,并自己构建组的输出,类似于:

regex = re.compile(r"^a (([\"'])(.*)\2.*|(\w*).*)$",re.MULTILINE)
matches = re.finditer(regex,string)
for match in matches:
    if match.group(3) is not None:
        print 'b {0}'.format(match.group(3))
    elif match.group(4) is not None:
        print 'b {0}'.format(match.group(4))
于 2013-04-10T22:28:05.843 回答