【问题标题】:Python unique lines [closed]Python独特的线条[关闭]
【发布时间】:2013-09-27 10:55:26
【问题描述】:

您好,我有一个格式如下的文本文件:

Sam
John
Peter
Sam 
Peter
John

我想使用正则表达式从文件中提取唯一记录,例如:

Sam
John
Peter

请帮帮我。

【问题讨论】:

标签: python


【解决方案1】:

使用集:

In [1]: name="""
   ...: Sam
   ...: John
   ...: Peter
   ...: Sam 
   ...: Peter
   ...: John"""

In [2]: print name

Sam
John
Peter
Sam 
Peter
John

In [3]: a=name.split()

In [4]: a
Out[4]: ['Sam', 'John', 'Peter', 'Sam', 'Peter', 'John']

In [5]: set(a)
Out[5]: {'John', 'Peter', 'Sam'}

【讨论】:

  • 感谢您的回答..但我希望在 python 中使用正则表达式得到相同的输出
  • @Prashant 你知道什么是正则表达式吗?这不是他们能解决的问题。
  • @l4mpi 你的意思是“这不是一个应该由他们解决的问题”。他们实际上可以解决这个问题。
  • @Veedrac 不,我的意思是“无法解决这个问题”。查找重复项超出了正则语言的范围,这是我听到“正则表达式”时所想到的。我知道有反向引用等,并且使用这个 RE 实际上能够处理的远远超过常规语言,但在我看来,这不是一个“真正的”正则表达式。并且将 RE 用于非常规的事情可能总是充其量是骇人听闻的,最坏的情况是愚蠢的......(不过,我仍然赞成你的回答,欣赏幽默^^)
【解决方案2】:

别听他们的!

当然这可以在正则表达式中完成。没关系,他们有正确的、可读且简洁的O(1) 解决方案,或者任何正则表达式解决方案都至少是二次时间的,并且与醉汉潦草的可读性差不多。

重要的是它是正则表达式,并且正则表达式必须是好的。给你:

re.findall(r"""(?ms)^([^\n]*)$(?!.*^\1$)""", target_string)
#>>> ['Sam', 'Peter', 'John']

【讨论】:

    【解决方案3】:

    您似乎想通过用新行拆分输入然后使用set() 删除重复项来创建一个列表。然后,您可以使用list() 将其转换为列表。看起来像下面。 strip() 用于删除换行符。

    names = list(set([x.strip() for x in open('names.txt').readlines()]))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多