正则表达式:在引号内和引号之外捕获组

时间:2018-04-03 23:02:50

标签: regex

我正在构建一个应该像这样工作的正则表达式:

如果我有一个字符串

testing my regex "testing 1234" asdf 'asdfasd'

我想得到这些小组:

testing my regex
"testing 1234"
asdf
'asdfasd'

目前我已经构建了正则表达式:

(^[^\"]*)\"([^\"]*)\"|'([^']*)' 可测试:https://regex101.com/r/NkRTzh/1/

在同一个字符串上返回:

testing my regex "testing 1234"
'asdfasd'

我怎样才能修改我的正则表达式,以便获得我想要的结果。我应该提一下,我正在使用这个在python中,因此报价转义。

3 个答案:

答案 0 :(得分:0)

试试这个:

0:5:14 = [0 5 10]

https://regex101.com/r/NkRTzh/4/

答案 1 :(得分:0)

你可以试试这个

\s*((\")|(')|\b)([^'\"]+)((?(2)\"|(?(3)'|(?<=\w))))

Demo

  • 捕获所需输出的组:组1,4,5(或\ 1,\ 4,\ 5)
  • 用于检查报价的捕获组:组2,3(或\ 2,\ 3)

替换为\1\4\5\n

testing my regex
"testing 1234"
asdf
'asdfasd'

如您所见,此正则表达式使用条件(?(n) ... | ,,, )来检查是否捕获了n-th捕获组,如果是,则匹配...模式,否则匹配,,,图案。我认为这种条件在某些情况下特别有用,它需要匹配成对引号(' ', " "),括号,括号,括号等。

答案 2 :(得分:0)

当您对这样的字符串进行标记时,最好将re.split与包含模式部分周围的捕获组的正则表达式一起使用,您也希望在结果数组中输出该模式部分。请参阅文档:

  

如果在模式中使用捕获括号,则模式中所有组的文本也将作为结果列表的一部分返回

在这里,使用

re.split(r"""("[^"]*"|'[^']*')""")

请参阅Python demo

import re
s= """testing my regex "testing 1234" asdf 'asdfasd'"""
print(re.split(r"""("[^"]*"|'[^']*')""",s))
# => ['testing my regex ', '"testing 1234"', ' asdf ', "'asdfasd'", '']
print(filter(None, re.split(r"""("[^"]*"|'[^']*')""",s)))
# => ['testing my regex ', '"testing 1234"', ' asdf ', "'asdfasd'"]

使用filter(None, list),您可以轻松删除在找到连续匹配时始终存在的空条目。