使用正则表达式捕获“关键字参数”

时间:2019-12-03 03:17:41

标签: python regex

我有一个这样的字符串

s="""
stkcode="10001909" marketid="sh" isstop="S 01" turnover="0" contractid="000000" time="84445850"
"""

我想捕获其中的所有“关键字args”子字符串,即stkcode="10001909"isstop="S 01"。请注意,由于某些字段值(例如s.split())中可能存在空格,因此普通的isstop="S 01"无法使用。正确的方法似乎是re.split,但我不知道如何编写适当的正则表达式。有人可以帮忙吗?谢谢!

修改 要添加更多信息:我们保证每个输入值中都没有"实际上,我们只需要“保护性”拆分即可,即仅将"对中的空白拆分出来。

编辑:XML是必经之路,而不是正则表达式。道歉

我的原始数据包括多行Timestamp + some aux info + an XML string。因此,它不能由XML解析器直接解析,而必须作为字符串逐行读取。因此,我最初以为每个(相对容易)单个字符串都只需要使用字符串和正则表达式即可。但是我显然是错的。 XML解析器是必经之路。

1 个答案:

答案 0 :(得分:0)

re.findall(r'((?!\<).*?)="(.*?)"', s)

产生:

[('stkcode', '10001909'),
(' marketid', 'sh'),
(' isstop', 'S 01'),
(' turnover', '0'),
(' contractid', '000000'),
(' time', '84445850')]

正则表达式说明:

(...)="(...)" 匹配此格式的所有内容,即您定义的kwarg格式

现在第一组: ((?!\<).*?)将匹配除前括号(.*?)以外的所有字符((?!\<)

第二组: (.*?) 只会匹配所有字符。右括号位于原始匹配模式的引号之外,因此您不必担心。

编辑:

要忽略字符周围的空格,请添加此反向匹配组 (?!\s) 不确定空格在您的字符串中会出现在哪里,但是这个新的正则表达式会在每个相关位置处理它:

((?!\<)(?!\s).*?(?!\s))="(?!\s)(.*?)(?!\s)