我正在构建一个应该像这样工作的正则表达式:
如果我有一个字符串
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中,因此报价转义。
答案 0 :(得分:0)
答案 1 :(得分:0)
你可以试试这个
\s*((\")|(')|\b)([^'\"]+)((?(2)\"|(?(3)'|(?<=\w))))
替换为\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)
,您可以轻松删除在找到连续匹配时始终存在的空条目。