【发布时间】:2021-11-14 05:24:08
【问题描述】:
我正在解析 pdf 并使用正则表达式提取文本。
这是text_pos的示例
text_pos = [['5. qwe', 'LLL LLL 23', 'zzz qqq ewq (qwe ewq)', 'ewq \nqwe', 'eee wwww', 'qwewww'],
['LLL LLL 54', 'ttt qqq (eee www)', 'eeee\neee', 'aaaaa \nwww'],
['K K K K K K K K K K K K K 7 /', '111', 'zzz qqq qwe (ewq Lee)', 'qwee\neen', 'eewwww']]
这是我的代码的sn-p
text_pos = []
.
.
.
# REGEX
aaa = re.compile(r'(K\s+K\s+K\s+K\s+K\s+K\s+K\s+K\s+K\s+K\s+K\s+K\s+K\s+\d.*)(zzz|ttt)', flags = re.DOTALL | re.MULTILINE)
bbb = re.compile(r'(LLL\s+LLL)(.*)(zzz|ttt)', flags = re.DOTALL | re.MULTILINE)
ccc = re.compile(r'(zzz|ttt\s+qqq)\s+(.*\))', flags = re.DOTALL | re.MULTILINE)
number = aaa.search(str(text_pos))
number1 = bbb.search(str(text_pos))
asker = ccc.search(str(text_pos))
try:
if number:
number.group(0)
except:
pass
try:
if number1:
number = number1.group(2)
except:
pass
try:
if asker:
asker.group(1)
except:
pass
data.append([number, asker])
df1 = pd.DataFrame(data, columns =['text', 'number'])
正则表达式 somehwat 工作,但有时它似乎将 text_pos 视为字符串,而有时则不(仅返回 re.Match object 而不是实际字符)。
期望的输出:
for v in df1['number']:
print(v)
23
54
7 /111
for v in df1['asker']:
print(v)
qqq ewq (qwe ewq)
qqq (eee www)
qqq qwe (ewq Lee)
实际输出:
for v in df1['number']:
print(v)
23', 'zzz qqq ewq (qwe ewq)', 'ewq \nqwe', 'eee wwww', 'qwewww'
54', 'ttt qqq (eee www)', 'eeee\neee', 'aaaaa \nwww
<re.Match object; span=(2, 3470), match="K K K K K K K K K K K K K 7 /', '111', 'zzz >
for v in df1['asker']:
print(v)
<re.Match object; span=(0, 59), match="['5. qwe', 'LLL LLL 23', 'zzz qqq>
<re.Match object; span=(24, 2203), match='ttt qqq (eee www)\', \'qwe>
<re.Match object; span=(47, 3015), match="zzz qqq qwe (ewq Lee)', 'q>
按照 Wiktors 的建议进行编辑:尝试对每个列表中的每个字符串进行正则表达式
for i in text_pos:
for j in i:
m = re.search(aaa, j)
if m:
number = m.group(0)
返回
for v in df1['number']:
print(v)
<re.Match object; span=(2, 3470), match="K K K K K K K K K K K K K 7 /', '111', 'zzz >
<re.Match object; span=(2, 3470), match="K K K K K K K K K K K K K 7 /', '111', 'zzz >
<re.Match object; span=(2, 3470), match="K K K K K K K K K K K K K 7 /', '111', 'zzz >
【问题讨论】:
-
正则表达式只适用于字符串,而不适用于对象。
-
我认为
.search(str(text_pos))应该让它像字符串一样对待..这似乎适用于前 2 个列表项 -
text_pos是一个列表列表。当您将其转换为字符串时,它会变成一个看起来像“笨拙”的列表的字符串。这不是您在字符串列表上运行正则表达式的方式。您需要对每个列表中的每个字符串运行正则表达式。 -
对不起,我决定仔细看看,不明白你的
df1['number']是在哪里声明的。还有,现在有什么问题吗?只是得到匹配的文本?返回m.group()而不仅仅是m(re.search的结果)。 -
看:
number = aaa.search(str(text_pos))和asker = ccc.search(str(text_pos)),然后data.append([number, asker])和df1 = pd.DataFrame(data, columns =['text', 'number'])导致显示匹配数据对象而不是整个匹配值。
标签: python regex regex-group