如何在python中使用正则表达式提取每行中需要的信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在python中使用正则表达式提取每行中需要的信息相关的知识,希望对你有一定的参考价值。

如题,有"temp.txt"文件,内容如下:
21899 6% S 15 173928K 38024K fg app_108 com.tencent.qq
21899 34% S 14 191436K 50888K fg app_108 com.tencent.qq
21899 49% S 14 183928K 41584K fg app_108 com.tencent.qq
21899 28% S 15 176984K 40240K fg app_108 com.tencent.qq
21899 6% S 15 177004K 40448K fg app_108 com.tencent.qq
21899 6% S 14 176048K 40564K fg app_108 com.tencent.qq
21899 10% S 14 176196K 40472K fg app_108 com.tencent.qq
21899 9% S 14 176232K 40712K fg app_108 com.tencent.qq
21899 12% S 14 176288K 40820K fg app_108 com.tencent.qq
21899 10% S 14 176288K 40820K fg app_108 com.tencent.qq
21899 12% S 16 179376K 40904K fg app_108 com.tencent.qq
如何提取出每行的百分比数值、两个内存占用值,并存储至'result.csv'中呢?
(如第一行提取“6%”,“173928”,“38024”三个值)
求大神指点!谢谢!

>>> s='''21899   6% S    15 173928K  38024K  fg app_108  com.tencent.qq
21899  34% S    14 191436K  50888K  fg app_108  com.tencent.qq
21899  49% S    14 183928K  41584K  fg app_108  com.tencent.qq
21899  28% S    15 176984K  40240K  fg app_108  com.tencent.qq
21899   6% S    15 177004K  40448K  fg app_108  com.tencent.qq
21899   6% S    14 176048K  40564K  fg app_108  com.tencent.qq
21899  10% S    14 176196K  40472K  fg app_108  com.tencent.qq
21899   9% S    14 176232K  40712K  fg app_108  com.tencent.qq
21899  12% S    14 176288K  40820K  fg app_108  com.tencent.qq
21899  10% S    14 176288K  40820K  fg app_108  com.tencent.qq
21899  12% S    16 179376K  40904K  fg app_108  com.tencent.qq'''
>>> open('a.txt','w').write(s)
>>> f=open('a.txt')
>>> f.read()
'21899   6% S    15 173928K  38024K  fg app_108  com.tencent.qq\\n21899  34% S    14 191436K  50888K  fg app_108  com.tencent.qq\\n21899  49% S    14 183928K  41584K  fg app_108  com.tencent.qq\\n21899  28% S    15 176984K  40240K  fg app_108  com.tencent.qq\\n21899   6% S    15 177004K  40448K  fg app_108  com.tencent.qq\\n21899   6% S    14 176048K  40564K  fg app_108  com.tencent.qq\\n21899  10% S    14 176196K  40472K  fg app_108  com.tencent.qq\\n21899   9% S    14 176232K  40712K  fg app_108  com.tencent.qq\\n21899  12% S    14 176288K  40820K  fg app_108  com.tencent.qq\\n21899  10% S    14 176288K  40820K  fg app_108  com.tencent.qq\\n21899  12% S    16 179376K  40904K  fg app_108  com.tencent.qq'
>>> pprint.pprint(map(lambda x:re.findall('\\d+? +?(\\d+%) +?S +?\\d+? +?(\\d+K) +?(\\d+K)',x),s.split('\\n')))
[[('6%', '173928K', '38024K')],
 [('34%', '191436K', '50888K')],
 [('49%', '183928K', '41584K')],
 [('28%', '176984K', '40240K')],
 [('6%', '177004K', '40448K')],
 [('6%', '176048K', '40564K')],
 [('10%', '176196K', '40472K')],
 [('9%', '176232K', '40712K')],
 [('12%', '176288K', '40820K')],
 [('10%', '176288K', '40820K')],
 [('12%', '179376K', '40904K')]]
>>> pprint.pprint(map(lambda x:re.findall('\\d+? +?(\\d+%) +?S +?\\d+? +?(\\d+K) +?(\\d+K)',x),open('a.txt').read().split('\\n')))
[[('6%', '173928K', '38024K')],
 [('34%', '191436K', '50888K')],
 [('49%', '183928K', '41584K')],
 [('28%', '176984K', '40240K')],
 [('6%', '177004K', '40448K')],
 [('6%', '176048K', '40564K')],
 [('10%', '176196K', '40472K')],
 [('9%', '176232K', '40712K')],
 [('12%', '176288K', '40820K')],
 [('10%', '176288K', '40820K')],
 [('12%', '179376K', '40904K')]]
>>>

参考技术A import re

file_object = open('temp.txt')
try:
str = file_object.read( )
finally:
file_object.close( )
result = re.findall("(\\d+%) S\\s+\\d+ (\\d+)K\\s+(\\d+)K",str)
f = open("test.csv","w")
for line in result:
f.write("%s,%s,%s\\n"%(line[0],line[1],line[2]))
f.close()

本回答被提问者采纳

如何使用正则表达式在python中提取子字符串

【中文标题】如何使用正则表达式在python中提取子字符串【英文标题】:How to extract substring in python using regular expression 【发布时间】:2018-03-25 03:27:49 【问题描述】:

我有一个字符串,例如this is title [[this is translated title]],我需要提取这两个子字段。 this is title, this is translated title

我尝试使用正则表达式,但无法完成。

def translate(value):
    # Values are paseed in the form of 
    # "This is text [[This is translated text]]"
    import re
    regex = r"(.+)(\[\[.*\]\])"
    match = re.match(regex, value)
    # Return text
    first = match.group(1)

    # Return translated text
    second = match.group(2).lstrip("[[").rstrip("]]")

    return first, second

但这会失败。当字符串为“简单纯文本”时

【问题讨论】:

你所拥有的似乎有效。有什么问题? 【参考方案1】:

我找到了一种不使用正则表达式的简单方法

def trns(value):
    first, second =  value.rstrip("]]").split("[[")
    return first, second

【讨论】:

【参考方案2】:

您必须使用正则表达式 r'((\w.*)\[\[(\w.*)\]\]|(\w.*))group(1) 中产生 this is title 并在 group(2) 中产生 this is translate title 所以您的代码应该是 p>

def translate(value):
    # value = "This is text [[This is translated text]]"
    import re
    regex = r'((\w.*)\[\[(\w.*)\]\]|(\w.*))'
    match = re.match(regex, value)
    result = [x for x in match.groups() if x and x!=value]
    return result if result else value

这会按预期返回。

要测试您的正则表达式,您可以使用this.

【讨论】:

我认为这会因 value="this is only text" 而失败

以上是关于如何在python中使用正则表达式提取每行中需要的信息的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用正则表达式提取 JSON 字符串的特定部分?

如何使用 python/django 从字符串中提取 url?(使用正则表达式)

使用正则表达式提取不同格式的日期并对其进行排序 - 熊猫

python中正则表达式的使用

python的正则表达式

在python中使用正则表达式提取日期