我是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))
答案 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
。这将返回一个字符串列表,然后您可以将其解除捆绑。