在多线蟒蛇上找到模式

时间:2018-03-02 14:28:39

标签: python regex

我花了两天时间尝试构建正则表达式,找到两个单词/数字顺序出现在不同的行上。 我有一个文件,如:

  1  [pid 29743] 18:58:19 prctl(PR_CAPBSET_DROP, 0x9, 0, 0, 0 <unfinished ...>
  2  [pid 29746] 18:58:19 <... mprotect resumed> ) = 0
  3  [pid 29743] 18:58:19 <... prctl resumed> ) = 0
  4  [pid   615] 18:58:19 <... ioctl resumed> , 0xffffffffffb4f054) = 0
  5  [pid 29743] 18:58:19 prctl(PR_CAPBSET_READ, 0xa, 0, 0, 0 <unfinished ...>
  6  [pid   615] 18:58:19 ioctl(13, 0x40047703 <unfinished ...>
  7  [pid 29743] 18:58:19 <... prctl resumed> ) = 1
  8  [pid 29746] 18:58:19 mprotect(0xfffffffff4ae2000, 4096, PROT_NONE <unfinished ...>
  9  [pid 29743] 18:58:19 prctl(PR_CAPBSET_DROP, 0xa, 0, 0, 0 <unfinished ...>
  10 [pid   615] 18:58:19 <... ioctl resumed> , 0x7fd19062e0) = 0
  11 [pid 29743] 18:58:19 <... prctl resumed> ) = 0
  12 [pid 29746] 18:58:19 <... mprotect resumed> ) = 0
  13 [pid 29743] 18:58:19 prctl(PR_CAPBSET_READ, 0xb, 0, 0, 0 <unfinished ...>
  14 [pid 29746] 18:58:19 ioctl(13, 0x40047703, 
  <unfinished ...>
  15 [pid 29743] 18:58:19 <... prctl resumed> ) = 1
  16 [pid   615] 18:58:19 <... ioctl resumed> , 0x7fd19064b0) = 0

我正在寻找在文本上顺序出现的两个值0x7fd19062e0和0x7fd19064b0。它们出现在第10和第16行。 我想构建正则表达式,告诉我是否出现顺序  这是我的代码

    file = open("text.txt", a+)
    for line in file:
        text += line
    if re.findall(r"^.*0x7fd19062e0.*0x7fd19064b0", text, re.M):
                       print 'found a match!'
                    else:
                       print 'no match'

2 个答案:

答案 0 :(得分:1)

re.M修改^$锚点的行为。对于“点匹配换行符”选项,您需要re.S。另外,如果您只想查找是否匹配,请不要使用re.findall()

file = open("text.txt")  # why append mode?
text = file.read()       # no need to build the string line by line
if re.search(r"\b0x7fd19062e0\b.*\b0x7fd19064b0\b", text, re.S):
     print 'found a match!'
else:
     print 'no match' 

请注意,我添加了word boundary anchors以确保只匹配整个十六进制数字(否则,可能会有更长数字的子匹配)。这可能与您的情况有关,也可能不相关,但这可能是一种很好的做法。

答案 1 :(得分:0)

无需RE:

f = open('text.txt')
numerated_lines = enumerate(f.readlines())
lines_with_pattern = filter(lambda l: '0x7fd19062e0' in l[1], enumerated_lines)
pairs = zip(lines, lines[1:])
result = filter(lambda p: p[0][0]+1 == p[1][0], pairs)
相关问题