正则表达式可选引号

时间:2013-04-10 22:06:09

标签: regex

我需要一个正则表达式来检测字符'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

我需要什么样的正则表达式?

2 个答案:

答案 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 ""不匹配。