首页 > 解决方案 > python中的正则表达式不匹配

问题描述

我在 python 上做正则表达式。我花了很多时间来修复并了解为什么正则表达式不起作用或不匹配。我在这里发布文本和我的代码。我可以知道我的代码有什么问题吗:

文字是:

[pid 30101] 04:15:46 writev(25, [{"\0\225ub'\375[\340\244\6/", 11}, {"\4", 1}, 
{"Id before\0", 17}, {"Id\0", 10}], 4) = 39
[pid 30101] 04:15:46 getuid()           = 10168
[pid 30101] 04:15:46 getuid()           = 10168
[pid 30101] 04:15:46 ioctl(8, BINDER_WRITE_READ, 0x7fc0656648) = 0
[pid 30101] 04:15:46 ioctl(8, BINDER_WRITE_READ, 0x7fc0656648) = 0
[pid 30101] 04:15:46 fstat(33, {st_mode=S_IFCHR|0666, st_rdev=makedev(10, 62), 
...}) = 0
[pid 30101] 04:15:46 fstat(33, {st_mode=S_IFCHR|0666, st_rdev=makedev(10, 62), 
...}) = 0
[pid 30101] 04:15:46 ioctl(33, ASHMEM_GET_SIZE, 0) = 84
[pid 30101] 04:15:46 dup(33)            = 34
[pid 30101] 04:15:46 close(33)          = 0
[pid 30101] 04:15:46 dup(34)            = 33
[pid 30101] 04:15:46 fstat(33, {st_mode=S_IFCHR|0666, st_rdev=makedev(10, 62), 
...}) = 0
[pid 30101] 04:15:46 ioctl(33, ASHMEM_GET_SIZE, 0) = 84
[pid 30101] 04:15:46 mmap(NULL, 84, PROT_READ, MAP_SHARED, 33, 0) = 
0x7d517db000
[pid 30101] 04:15:46 fstat(33, {st_mode=S_IFCHR|0666, st_rdev=makedev(10, 62),...}) = 0
[pid 30101] 04:15:46 ioctl(33, ASHMEM_GET_SIZE, 0) = 84
[pid 30101] 04:15:46 fstat(34, {st_mode=S_IFCHR|0666, st_rdev=makedev(10, 62), 
 ...}) = 0
[pid 30101] 04:15:46 fstat(34, {st_mode=S_IFCHR|0666, st_rdev=makedev(10, 62),...}) = 0
[pid 30101] 04:15:46 ioctl(34, ASHMEM_GET_SIZE, 0) = 84
[pid 30101] 04:15:46 close(34)          = 0
[pid 30101] 04:15:46 getuid()           = 10168
[pid 30101] 04:15:46 writev(25, [{"\0\225ub'\375[\260y\3274", 11}, {"\4", 1}, 
{"After\0", 16}, {"eb41e1a15da0b8ee\0", 17}], 4) = 45
[pid 30101] 04:15:46 ioctl(8, BINDER_WRITE_READ, 0x7fc0656ee8) = 0
[pid 30101] 04:15:46 ioctl(8, BINDER_WRITE_READ, 0x7fc0656ee8) = 0

这是我的代码:

import re
text = open('textfile.txt').read()
pid= str(30101)
if re.findall(r"^.* " + pid +"] \d\d:\d\d:\d\d getuid()^.*" + pid +"]\d\d:\d\d:\d\d ioctl\(8\, BINDER_WRITE_READ\, 0x7fc0656648\)^.*" + pid +"] \d\d:\d\d:\d\d fstat\(33\, \{st_mode=S_IFCHR\|0666\, st_rdev=makedev\(10\, 62\)\, 
...\}\).*", text, re.M):
   print 'found a match!'
else:
   print 'no match'

标签: pythonregex

解决方案


在开发正则表达式时尝试从小处着手。某些字符(如[, ], (, ), ...)具有特殊含义。如果要从字面上匹配这些字符,则需要通过\在字符前面附加 a 来转义它们。

使用转义的正则表达式的简化版本:

import re
text = open('textfile.txt').read()
pid= str(30101)
print re.findall(r"^.* " + pid + "\] \d\d:\d\d:\d\d getuid\(\)", text, re.M)

产生以下输出:

['[pid 30101] 04:15:46 getuid()', '[pid 30101] 04:15:46 getuid()', '[pid 30101] 04:15:46 getuid()']

我建议阅读re解释语法的模块的 python 文档,然后逐步扩展您的正则表达式。

这回答了你的问题了吗?


推荐阅读