python中筛选_用Python中的re做信息筛选

背景

平时工作中,我们经常会处理大量的元数据(Raw Data),而一般的文件编辑器只能一次查询一个关键字,这就难以连续的分析元数据,比如分析产品日志文件(log),日志可能包括很多information级别的信息,这些一般是我们不太关心的,我们主要关心的是一些特殊的调试(Debug)级别的信息,所以就有必要根据很多关键字筛选出来日志文件中我们所关系的信息,这样筛选出来的日志文件不仅具有连续性,而且易读性会非常好。

解决方案

re是Python自带的正则表达式库文件,为字符串的匹配筛选提供了极大的便利,本文就是利用re来进行日志文件的信息筛选。首先,简单来看一下re中的主要函数:

1. Compile(pattern, flag):对正则表达式进行编译,比检查语法的正确性。flag是编译的标签,这里只介绍DOTALL,表示匹配所有的字符,包括新的行。

>>> importre>>> re.compile('[abc]+')

re.compile('[abc]+')>>>re.compile(test)

Traceback (most recent call last):

File"", line 1, in NameError: name'test' is notdefined>>>

2. match(): 从目标字符串的开头来判断是否与正则表达式匹配,如果不匹配返回None,反之,返回匹配对象,包括起始位置,结束位置,字符串内容

>>> importre>>> test = re.compile('[abc]+')>>> test.match('dabc')>>> test.match('babc')<_sre.sre_match object span="(0," match="babc">

test是一个以a或b或c开头的正则表达式编译对象,而match是从目标字符串的开头进行匹配,所以第一个目标字符串“dabc”不符合正则表达式规则,所以返回None;第二个目标字符串可以正常匹配输出匹配对象(起始位置,匹配内容),由于match每次都从目标字符串的开头进行匹配,所以如果有匹配字符串,其开始位置始终为0.

3. search:与match功能相近,search会扫描全目标字符串进行正则表达式匹配。

>>> importre>>> test = re.compile('[abc]+')>>> test.search('dabc')<_sre.sre_match object span="(1," match="abc">

>>>

这时用search就可以匹配a,b,c开头的字符串了

4. findall:找出目标字符串中所有的匹配字符串,并以列表的形式返回

>>> test = re.compile('\w+@163.com')>>> test.findall(r"alvin@163.comtest1234@163.comnotvalid@gmail.com")

['alvin@163.com', 'test1234@163.com']

当然,re中还有很多其他的函数可供大家使用,大家可以去查阅python官方文档。

其次,介绍几个正则表达式常用的符号:

1. *: 表示匹配其前面字符0或多次

2. .: 表示匹配新行之外的所有字符

3. |: 表示或操作

4. +:表示匹配其前面紧邻字符一次或多次

5. ?: 表示匹配0或1次

其他的正则表达式的表示也可去官网文档查看。

最后,上一下这个简单的筛选程序:

importre

source= 'GCM.txt'target= 'g2s.txt'

#一级筛选

raw_compile = re.compile(r"",re.DOTALL)#二级筛选

messagelevel_compile = re.compile(r"

egmlevel_compile = re.compile(r"IGT_00012E2335AA.*",re.DOTALL)defFilterG2SMessage():

fr=open(source)

content=fr.read()

fr.close()

f= open(target,'w')

g2sItems=raw_compile.findall(content)for g2s ing2sItems:

iscaredG2S=messagelevel_compile.search(g2s)

isCaredEGM=egmlevel_compile.search(g2s)if iscaredG2S andisCaredEGM:

f.write(g2s+'\n')else:passf.close()

FilterG2SMessage()

程序很简单,在筛选的过程中大家可以先分析一下筛选的级别,可以逐级筛选。

总结:

re不仅仅提供了正则表达式的匹配,而且提供了一些批量处理的函数,比如split,sub,subn等等,这些函数都可以提高我们对文件内容的快速处理,节省时间。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,我是 CSDN 开发的 C 知道。关于您的问题,可以使用 Python 的 encode() 函数将字符串转换为 Unicode 编码,然后使用正则表达式或其他方法筛选出所需的编码。具体实现可以参考以下代码: ```python # -*- coding: utf-8 -*- import re # 定义字符串 str = "Hello, 世界!" # 将字符串转换为 Unicode 编码 unicode_str = str.encode('unicode_escape').decode() # 使用正则表达式筛选出编码 unicode_list = re.findall(r'\\u\w{4}', unicode_str) # 输出结果 print(unicode_list) ``` 以上代码将输出字符串的所有 Unicode 编码,如下所示: ``` ['\\u0048', '\\u0065', '\\u006c', '\\u006c', '\\u006f', '\\u002c', '\\u002', '\\u4e16', '\\u754c', '\\uff01'] ``` 希望能对您有所帮助。 ### 回答2: 在Python,我们可以使用内置的ord()函数来获取一个字符的Unicode编码。ord()函数接受一个字符作为参数,并返回该字符的Unicode编码。我们可以将这个函数应用于字符串的每个字符,从而筛选出字符串的Unicode编码。 首先,我们需要定义一个函数来筛选字符串的Unicode编码。这个函数接受一个字符串作为参数,并返回一个包含字符串每个字符的Unicode编码的列表。 ```python def filter_unicode(string): unicode_list = [] for char in string: unicode_list.append(ord(char)) return unicode_list ``` 在这个函数,我们通过遍历字符串的每个字符,并使用ord()函数获取该字符的Unicode编码。我们将获取到的Unicode编码添加到一个列表,并最终返回这个列表。 接下来,我们可以调用这个函数并传入一个字符串来获取该字符串的Unicode编码。例如: ```python string = "Hello, 你好!" unicode_list = filter_unicode(string) print(unicode_list) ``` 运行以上代码,我们将得到一个包含字符串每个字符的Unicode编码的列表: ``` [72, 101, 108, 108, 111, 44, 32, 20320, 22909, 65281] ``` 这样,我们就成功地用Python筛选出了字符串的Unicode编码。 ### 回答3: 在Python,可以使用`ord()`函数来获取给定字符的Unicode编码。下面是一个示例代码,演示如何使用Python筛选出字符串的Unicode编码。 ```python def filter_unicode(string): unicode_list = [] for char in string: unicode_value = ord(char) if unicode_value > 127: # 过滤出Unicode编码大于127的字符 unicode_list.append(unicode_value) return unicode_list # 示例用法 string = "Hello, 你好!" unicode_list = filter_unicode(string) print("字符串的Unicode编码:", unicode_list) ``` 在上面的代码,定义了一个名为`filter_unicode()`的函数,该函数接受一个字符串作为输入,并返回一个列表,其包含字符串所有Unicode编码大于127的字符的Unicode值。 在函数的实现,我们使用了一个`for`循环来迭代字符串的每个字符。通过调用`ord()`函数,我们将当前字符转换为Unicode编码,并将其保存在`unicode_value`变量。然后,我们检查`unicode_value`是否大于127,如果是,则将其添加到`unicode_list`列表。 最后,我们调用`filter_unicode()`函数来进行测试,并打印输出结果,从而筛选出字符串的Unicode编码。在这个示例,字符串`"Hello, 你好!"` 文字符的Unicode编码是大于127的,因此输出结果将是`[20320, 22909]`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值