我需要一个正则表达式来检测字符'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
我需要什么正则表达式?
我需要一个正则表达式来检测字符'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
我需要什么正则表达式?
如果引号中不允许使用引号,则可以使用以下方法:
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 ""
。
尝试:
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))