繁体   English   中英

使用Regex从文本中提取元素并追加到字典

[英]Using Regex to extract elements from text and append to dictionary

我试图通过使用某种类型的循环和正则表达式从网站上检索的文本创建字典。 我希望字典看起来像这样:

{36:30281, 36 2/3:30282, 37:30283, 37 1/3: 30283, 38:30284 etc..}

这是我从网站上检索到的文字:

[option value="-1">Choose size</option>, option value="30281">\r\n\t\t\t\t\t\t\t\t\t36\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/option>, option value="30282">\r\n\t\t\t\t\t\t\t\t\t36 2/3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/option, option value="30283"\r\n\t\t\t\t\t\t\t\t\t37 1/3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/option, option value="30284">\r\n\t\t\t\t\t\t\t\t\t38\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</option>, option value="30285">\r\n\t\t\t\t\t\t\t\t\t38 2/3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</option>, option value="30286">\r\n\t\t\t\t\t\t\t\t\t39 1/3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</option>, option value="30287">\r\n\t\t\t\t\t\t\t\t\t40\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</option>, option value="30288">\r\n\t\t\t\t\t\t\t\t\t40 2/3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</option>, option value="30289">\r\n\t\t\t\t\t\t\t\t\t41 1/3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</option>]

我对正则表达式不太满意。 谁能给我一个可以帮助我做到这一点的解决方案?

谢谢

这是一个有效的正则表达式:

re.findall('\\t(\d{2}\s+\d\/\d)\\r\\n', [option value="-1">Choose size</option>, 'option value="30281">\r\n\t\t\t\t\t\t\t\t\t36\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/option>, option value="30282">\r\n\t\t\t\t\t\t\t\t\t36 2/3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/option, option value="30283"\r\n\t\t\t\t\t\t\t\t\t37 1/3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/option, option value="30284">\r\n\t\t\t\t\t\t\t\t\t38\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</option>, option value="30285">\r\n\t\t\t\t\t\t\t\t\t38 2/3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</option>, option value="30286">\r\n\t\t\t\t\t\t\t\t\t39 1/3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</option>, option value="30287">\r\n\t\t\t\t\t\t\t\t\t40\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</option>, option value="30288">\r\n\t\t\t\t\t\t\t\t\t40 2/3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</option>, option value="30289">\r\n\t\t\t\t\t\t\t\t\t41 1/3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</option>]')

输出:

['36 2/3', '37 1/3', '38 2/3', '39 1/3', '40 2/3', '41 1/3']

它的工作方式主要取决于您自己,但以下是更改。 我删除了除正则表达式第一部分以外的所有内容。 我将13更改为'\\d' ,这意味着任何数字,而不仅仅是1和3。 然后我在末尾添加了'\\\\r\\\\n' ,但这并不是真正必要的,因此您可以根据需要将其删除,但是我想这对您来说只是额外的安全性。

可以使用( demo ):

value=\"(\d+)\"\D*(\d+(?:\ [\d/]+)?)


Python这将是(使用dict理解):

 import re junk_string = """ [option value="-1">Choose size</option>, option value="30281">\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t36\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t/option>, option value="30282">\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t36 2/3\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t/option, option value="30283"\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t37 1/3\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t/option, option value="30284">\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t38\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t</option>, option value="30285">\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t38 2/3\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t</option>, option value="30286">\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t39 1/3\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t</option>, option value="30287">\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t40\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t</option>, option value="30288">\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t40 2/3\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t</option>, option value="30289">\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t41 1/3\\r\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t</option>] """ rx = re.compile(r'value=\\"(\\d+)\\"\\D*(\\d+(?:\\ [\\d/]+)?)') result = {m.group(2): m.group(1) for m in rx.finditer(junk_string)} print(result) # {'36': '30281', '36 2/3': '30282', '37 1/3': '30283', '38': '30284', '38 2/3': '30285', '39 1/3': '30286', '40': '30287', '40 2/3': '30288', '41 1/3': '30289'} 

但是,正如评论中已经说过的那样,这实际上不是文本,而是DOM一部分,因此至少应考虑使用解析器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM