Регулярное выражение в Python не совпадает - PullRequest
0 голосов
/ 29 ноября 2018

Я делаю регулярные выражения на 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'

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Спасибо всем, ребята, я попробовал regex101.com очень полезным и хорошим для построения моего регулярного выражения в python.Я пытался создать свое регулярное выражение, но столкнулся с проблемой.Есть два соответствия dup () в 10 и 12 строках.Каждый раз мое регулярное выражение совпадает с dup () в строке 12, но я хочу найти следующее первое совпадение в 10 строке.Я хочу, чтобы матч начинался сверху вниз, а не снизу вверх.Я чувствую проблему из-за [\ s \ S] +.я правильно его использую?

Вот моя попытка: https://regex101.com/r/5WpzKV/3

0 голосов
/ 29 ноября 2018

Попробуйте начать с малого при разработке регулярных выражений.Некоторые символы (например, [, ], (, ), ...) имеют особое значение.Если вы хотите буквально сопоставить эти символы, вам нужно их избежать, добавив \ перед символом.

Упрощенная версия вашего регулярного выражения с использованием экранированных символов:

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, который объясняет синтаксис, а затем постепенно расширяет ваше регулярное выражение.

Это отвечает на ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...