【问题标题】:why does REGEX GROUP treat list of strings sometimes as string and sometimes as list?为什么 REGEX GROUP 有时将字符串列表视为字符串,有时将其视为列表?
【发布时间】: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() 而不仅仅是mre.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


【解决方案1】:

我无法解释为什么以下方法有效,但它确实有效

    text_list = ' '.join(map(str, text_pos))
  
    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)(([^zzz|ttt]*).*)', flags = re.DOTALL | re.MULTILINE)
    ccc = re.compile(r'(LLL\s+LLL)(([^zzz|ttt]*).*)', flags = re.DOTALL | re.MULTILINE)
    
    number = aaa.search(text_list)
    number1 = ccc.search(text_list)
    
    if number:
        number = number.group(3)
    else:
        number = number1.group(3)

data.append([text_list, number])
fake_file_handle.close()

df1 = pd.DataFrame(data, columns =['text_list', 'WP / number'])


for v in df1['number']:
    print(v)

23
54
7 / 1864 

【讨论】:

  • 您可以在此处访问组值,number.group(3)。在data.append([text_list, number]) 中追加时,您的number 已经是一个字符串,而不是一个对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多