我需要一个正则表达式来检测字符'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
我需要什么样的正则表达式?
答案 0 :(得分: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))
答案 1 :(得分: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
(替换为b)。好吗?它与a ""
不匹配。