如何使用正则表达式从文本中提取值到列表中?

时间:2017-10-28 05:04:33

标签: python regex

我有一个这样的字符串:

string='<final:company name>  abc. </final:company name> <final:number of employees> 143.</final:number of employees> <final: average salary>  medium. </final: average salary>'

我想要提取的是所有模式表达式标题,然后是< >内的值。所以,我想: - 公司名称, - 员工数量, - 平均薪水可能在一个列表中 我想分别提取值,如: abc,143,medium

当我编码如下:

regex='<final:(.*?)</final'
pattern=re.compile(regex)
finding=re.findall(pattern,string)
print(finding)

我得到[&#39;公司名称&gt; ABC。 &#39;,&#39;员工人数&gt; 143。&#39;,&#39;平均工资&gt;介质。 &#39;] 这不是我想要的东西。我该如何正确编码?

2 个答案:

答案 0 :(得分:4)

您可以使用此正则表达式:

void MyFrame::OnItemChecked(wxTreeListEvent& event)
{
    wxTreeListItem item = event.GetItem();
    wxCheckBoxState itemCheckboxState =m_treelist->GetCheckedState(item);
    m_treelist->CheckItemRecursively(item, itemCheckboxState);
 }

您的第1组将包含标签,即公司名称,员工人数,平均工资和第2组将包含其值,即abc,143,medium。

现场演示here

<强>输出

regex = r'<final:([^>]*)>\s*([^<\s\.]*)'

要从>>> pattern=re.compile(regex) >>> finding=re.findall(pattern,string) >>> print(finding) [('company name', 'abc'), ('number of employees', '143'), (' average salary', 'medium')] 制作2个不同的列表,您可以执行以下操作:

finding

或者您也可以使用>>> tags = map(lambda x: x[0], finding) >>> values = map(lambda x: x[1], finding) >>> tags ['company name', 'number of employees', ' average salary'] >>> values ['abc', '143', 'medium'] 将其转换为两个列表:

zip

答案 1 :(得分:1)

允许内容中的空格并删除标记名称中的空格

import re

string='<final:company name>  abc. </final:company name> <final:number of employees> 143.</final:number of employees> <final: average salary>  medium. </final: average salary>'

rx = re.compile(r'''
    <final:\s*
    (?P<tag>[^>]+)>
    (?P<content>[^<]+)
    </final:\1>''', re.X)

results = {m.group('tag').strip(): m.group('content').strip() for m in rx.finditer(string)}
print(results)
# {'number of employees': '143.', 'company name': 'abc.', 'average salary': 'medium.'}

<小时/> 之后,您将能够访问results['company name']等元素 一般来说,这看起来像一些(无效?)XML文件。如果它是有效的(并且你在复制到问题时只是有一些拼写错误)考虑使用真正的解析器。

请参阅a demo on regex101.com