【问题标题】:Matching text between a pair of single quotes [duplicate]一对单引号之间的匹配文本[重复]
【发布时间】:2019-03-11 14:20:27
【问题描述】:

我正在尝试从 .txt 文件中提取 ImageNet 标签,如下所示。

998:'耳朵,穗状花序,头状花序', 999: '卫生纸、卫生纸、卫生纸'}

我试过了

label = []

txt = open("imagenet1000_clsid_to_human.txt").readlines()
#  print(str(txt))
p = re.compile(r"'(.*?)'")

#  print(txt)
for i in range(len(txt)):
    #  print(txt[i])
    #  print('\n')
    m = p.match(txt[i])

    if m:
        lis = list(m.group())[:-1]
        s = ''.join(lis)
        print(s)
        label.append(s)

提取单引号内的子字符串,但它不断吐出'None'。

我已经尝试过在线正则表达式编译器,它工作得非常好。有人可以就这个问题给点建议吗?

【问题讨论】:

  • 感谢您的评论,但仍然无法正常工作...
  • 您需要在正则表达式中转义特殊字符。使用 \'
  • 查看re包中的findall函数。
  • 好吧,我没有显示我所有的 .txt 文件,但它由多行组成!
  • 哦,是的。对不起,看错你的帖子了。我将编辑我的答案 - findall 仍然是您所需要的。

标签: python regex


【解决方案1】:

主要问题是您应该使用re.search(),而不是re.match()re.match() 匹配从字符串开头开始的模式,在模式的开头有一个隐含的^

对 RE 模式使用原始字符串是明智之举,但括号已过分:

import re

txt = "998: 'ear, spike, capitulum', 999: 'toilet tissue, toilet paper, bathroom tissue'"

p = re.compile(r"'(.*?)'")
m = p.search(txt)
print(m.groups())

给予:

('ear, spike, capitulum',)

【讨论】:

    【解决方案2】:

    这行得通:

    import re
    re.findall(r"'(.*?)'", txt)
    

    这个正则表达式链接:

    https://regex101.com/r/QP8omt/1

    【讨论】:

      【解决方案3】:

      并非所有事情都需要通过正则表达式完成。

      label = []
      
      with open("imagenet1000_clsid_to_human.txt", 'r', encoding='utf8') as f:
          for line in f:
              parts = line.split("'")
              if len(parts) == 3:
                  label.append(parts[1])
      

      旁注:始终打开具有特定编码的文本文件。如果您不确定文件的编码是什么,那么 Python 也是如此。没有神奇的编码检测,你不应该依赖 Python 的默认值。

      【讨论】:

      • 谢谢!但是len(parts) == 3 是从哪里来的呢?
      • 我插入了它以确保只考虑包含恰好包含两个单引号的行,即拆分后正好包含 3 个部分。
      • 知道了!谢谢:D
      猜你喜欢
      • 2021-07-10
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多