为什么此Python Regex表达式不起作用?

时间:2018-09-29 21:16:33

标签: python regex

我是regex表达式和python的新手。但是创建了一个使用多个正则表达式的脚本。其中两个,通过Regexpal.com运行时有效。但是当我运行脚本时。他们不工作。当我运行其他正则表达式时,脚本运行良好。这是两个不起作用的。有人可以解释为什么他们不起作用,并给我正确的表达方式吗? 我测试了这三种不同的方法,没有任何效果。我有一条线

Patient: Höler, Adam* 10.07.1920    ID-Nr: 1118111111

我想提取Patient: Höler, Adam

Patient:\s.*\*
Patient:.*?([*])
Patient:.*\*

我还有

VCI-exsp = 20mm; 

我正在尝试提取VCI-exsp=20mm(摆脱';')。这是我制作的regex表达式,但它也可以在regexpal.com(和Atom)上运行,但是在我运行脚本时不起作用。

VCI-exsp =[^;]*

这是我拥有的脚本,regexText是充满我的regex表达式的文本文件。 Realthingnotaphony是文本文件,其中包含我要从中提取数据的文本。如果问题出在我不包括r,该如何将其注入表达式中?

regexarr = []
with open("regexText.txt") as fw:
    for line in fw:
        regexarr.append(re.compile(line))
matchs = []
count = 1
with open('Realthingnotaphony.txt') as f:
    for line in f:
        for regexp in regexarr:
            test = re.search(regexp, line)
        if test != None:
            matchs.append(test)
            print(test.group(0))

1 个答案:

答案 0 :(得分:0)

您正在从文本文件中读取内容,但没有删除换行符。这意味着您的搜索条件与您认为的不一样。您可以在加载第一个文件后使用print(regexarr)进行检查。

[re.compile('Patient:\\s.*\\*\n'), re.compile('Patient:.*?([*])\n'), re.compile('Patient:.*\\*\n')]

将代码更改为:

import re

with open("regexText.txt") as fw:
    # This removes the newline character
    regexarr = fw.read().splitlines()
# print(regexarr)
matchs = []
count = 1
with open('Realthingnotaphony.txt') as f:
    for line in f:
        for regexp in regexarr:
            test = re.search(regexp, line)
        if test != None:
            matchs.append(test)
            print(test.group(0))

然后您的搜索字词Patient:\s.*\*VCI-exsp =[^;]*将起作用。

注意:

将条目添加到匹配列表时会出现逻辑错误,因为您正在遍历每个搜索词并重置结果。这意味着您只能在最后一个搜索字词上获得结果!

您可以通过测试输出或移动正则表达式循环来解决此问题。请注意,您不能只与for line in f交换它,因为那是一个迭代器,您将在第一个循环中耗尽该迭代器。

这将使您的代码:

import re

with open("regexText.txt") as fw:
    regexarr = fw.read().splitlines()
# print(regexarr)
matchs = []
count = 1
for regexp in regexarr:
    with open('Realthingnotaphony.txt') as f:
            for line in f:    
                test = re.search(regexp, line)
                if test != None:
                    matchs.append(test)
                    print(test.group(0))

您还可以通过以下方法解决此问题:加载整个文件而不是每一行,并使用re.findall方法而不是re.search。这将返回一个字符串列表,然后您可以将其解除捆绑。