【问题标题】:python regular expressions - how to get all the names in a line?python正则表达式 - 如何获取一行中的所有名称?
【发布时间】:2018-04-07 13:44:03
【问题描述】:

如何使用正则表达式从下面的行中获取名称??

line #1==> 
Elector's Name: Surpam Badurubai Elector's Name: Madavimaru Elector's Name: Madavitannubai 

line #2==>
Elector's Name: GEDAM KARNU Elector's Name: GEDAM BHEEM BAI Elector's Name: Surpam Rajeshwar Rav

我试过了

regex = "\s*Elector\'s\sName\:\s([[a-zA-z]*\s[a-zA-z]*\s*[a-zA-z]*]*)\s" 
re.findall(regex, line)

它在第 1 行工作,但无法获取姓氏。 对于第 2 行,它仅从姓氏中获取“Surpam Rajeshwar”,但实际上其中包含 3 个单词。

非常感谢,如果有人可以帮助我解决这个问题或建议我以不同的方式获取名称。 !!

【问题讨论】:

  • 对您的 RE 使用原始字符串,并且您可能希望前导和尾随空格为“零或多个”:`regex = r"\s* ... \s*"跨度>

标签: python regex python-2.7 python-3.x names


【解决方案1】:

如果您只需要获取所有名称,可以尝试使用 .split() 和分隔符 Elector's Name:。喜欢:

names = line.split('Elector's Name:')
for i in names:
    print(i)

【讨论】:

    【解决方案2】:

    根据"Elector's Name: " 文本(前后有可选空格),re.split 看起来更像是一项工作,链接在列表理解中以过滤掉空字段:

    [x for x in re.split("\s*Elector's Name:\s*",l1) if x]
    

    通过您的示例,我得到了这些输出:

    ['GEDAM KARNU', 'GEDAM BHEEM BAI', 'Surpam Rajeshwar Rav']
    ['Surpam Badurubai', 'Madavimaru', 'Madavitannubai']
    

    请注意,您也可以使用链接到 str.split()str.split() 来实现此目的:

    [x.strip() for x in l1.split("Elector's Name:") if x]
    

    【讨论】:

    • 感谢您的回答!
    【解决方案3】:

    杰米·扎温斯基:

    有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

    所以,使用 python

    line = "Elector's Name: Surpam Badurubai Elector's Name: Madavimaru Elector's Name: Madavitannubai"
    [name.strip() for name in line.split("Elector's Name:") if name != '']
    

    【讨论】:

      【解决方案4】:

      您可以在不使用正则表达式的情况下通过Elector's Name: 进行拆分,从空格中删除结果项并删除所有空项:

      ss = ["Elector's Name: Surpam Badurubai Elector's Name: Madavimaru Elector's Name: Madavitannubai",
         "Elector's Name: GEDAM KARNU Elector's Name: GEDAM BHEEM BAI Elector's Name: Surpam Rajeshwar Rav"]
      for s in ss:
          print(filter(None, [x.strip() for x in s.split("Elector's Name:")]))
      

      看到Python demo,输出:

      ['Surpam Badurubai', 'Madavimaru', 'Madavitannubai']
      ['GEDAM KARNU', 'GEDAM BHEEM BAI', 'Surpam Rajeshwar Rav']
      

      如果您想学习正则表达式,这里有一个可能的基于正则表达式的解决方案:

      re.findall(r"Elector's Name:\s*(.*?)(?=\s*Elector's Name:|$)", s) 
      

      another Python demo

      模式详情

      • Elector's Name: - 文字子串
      • \s* - 0+ 个空格
      • (.*?) - 第 1 组(此值由 re.findall 返回):除换行符之外的任何 0+ 字符(包括 re.DOTALL,包括它们)尽可能少
      • (?=\s*Elector's Name:|$) - 正向前瞻,需要 0+ 个空格和 Elector's Name: 紧随其后,或者紧跟当前位置右侧的字符串结尾 ($)。

      【讨论】:

      • 感谢 Wiktor,帮助我进行了简洁的描述。我已经应用了它并且它有效。
      猜你喜欢
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2010-11-25
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      相关资源
      最近更新 更多