如何使用python中的正则表达式检索给定行中的字段值(值本身就是字符串)

时间:2010-11-18 09:29:10

标签: python

我是python的新手,我正面临下面的问题,请帮助我:

我从一个文件中逐行读取,每行都有字段名称及其值, 现在我必须找到line.example行中的字段名称和文件值:

line=" A= 4 | B='567' |c=4|D='aaa' "

由于某些字段值本身就是一个字符串,因此我无法创建正则表达式来检索字段名称和字段值。

请通过以上示例告诉我正则表达式。 输出应该是

A=4 

B='567'

c=4

D='aaa'

3 个答案:

答案 0 :(得分:1)

我能想到的最简单的解决方案是将每一行转换为字典。我假设您的字符串中没有任何引号或|标记(请参阅我对该问题的评论)。

result={}                      # Initialize a dictionary
for line in open('input.txt'): # Read file line by line in a memory-efficient way
    # Split line to pairs using '|', split each pair using '='
    pairs = [pair.split('=') for pair in line.split('|')]
    for pair in pairs:
        key, value = pair[0].strip(), pair[1].strip()
        try:                     # Try an int conversion
            value=int(value)
        except:                  # If fails, strip quotes
            value=value.strip("'").strip('"')
        result[key]=value        # Add current item to the results dictionary

,对于以下输入:

A= 4 | B='567' |c=4|D='aaa' 
E= 4 | F='567' |G=4|D='aaa' 

会给:

{'A': 4, 'c': 4, 'B': '567', 'E': 4, 'D': 'aaa', 'G': 4, 'F': '567'}

注意:

  • 如果您认为'567'是一个数字,则可以在尝试将其转换为整数之前删除"'
  • 如果您需要考虑花车,可以试试value=float(value)。记住在int转换尝试之后执行它,因为每个int也是一个浮点数。

答案 1 :(得分:0)

试试这个:

import re

line = " A= 4 | B='567' |c=4|D='aaa' "
re.search( '(?P<field1>.*)=(?P<value1>.*)\|(?P<field2>.*)=(?P<value2>.*)\|(?P<field3>.*)=(?P<value3>.*)\|(?P<field4>.*)=(?P<value4>.*)', line ).groups()

输出:

(' A', ' 4 ', ' B', "'567' ", 'c', '4', 'D', "'aaa' ")

如果您的字段和值不包含空格,您也可以尝试使用\ S *而不是。*。这将消除输出中的空格:

re.search( '(?P<field1>\S*)\s*=\s*(?P<value1>\S*)\s*\|\s*(?P<field2>\S*)\s*=\s*(?P<value2>\S*)\s*\|\s*(?P<field3>\S*)\s*=\s*(?P<value3>\S*)\s*\|\s*(?P<field4>\S*)\s*=\s*(?P<value4>\S*)', line ).groupdict()

输出:

{'field1': 'A',
 'field2': 'B',
 'field3': 'c',
 'field4': 'D',
 'value1': '4',
 'value2': "'567'",
 'value3': '4',
 'value4': "'aaa'"
}

这将创建相关的组:

[ re.search( '\s*([^=]+?)\s*=\s*(\S+)', group ).groups( ) for group in re.findall( '([^=|]*\s*=\s*[^|]*)', line ) ]

输出:

[('A', '4'), ('B', "'567'"), ('c', '4'), ('D', "'aaa'")]

有帮助吗?

答案 2 :(得分:0)

假设您没有嵌套引号或不匹配引号等令人讨厌的内容,则可以使用splitstrip完成所有操作:

>>> line = " A= 4 | B='567' |c=4|D='aaa' "
>>> values = dict((x.strip(" '"), y.strip(" '")) for x,y in (entry.split('=') for entry in line.split('|')))
>>> values
{'A': '4', 'c': '4', 'B': '567', 'D': 'aaa'}