【问题标题】:keep all alphabetic and numeric characters in python在python中保留所有字母和数字字符
【发布时间】:2023-03-16 02:51:01
【问题描述】:

我有一个 file.txt,我只想保留所有没有空格的字母和数字字符并将其保存在列表中,还有其他方法吗? 这是新代码,速度更快。你怎么看?

fin = open(fcompiti, encoding = 'UTF-8')
s = fin.read()
s = s.replace(' ', '').replace('\n','')

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    Regex (regular expressions) 是你的朋友。

    fin = open('file.txt')
    s = fin.read()
    alphanums = re.sub(r'[\W_]+', '', s)
    

    This 的回答将为您提供更多关于其工作原理和原因的知识和示例。

    【讨论】:

    • 啊,太好了,我们同时发布类似的帖子,这是一个加分项:D
    【解决方案2】:

    您可以尝试使用正则表达式,它可能会或可能不会比您的方法更快(取决于文本的大小和结构)。

    import re
    
    with open('file.txt') as f:
        s = f.read()
    
    s = ''.join(re.findall(r'[\dA-z]+', s))
    

    附带说明,您的代码没有达到应有的内存效率。您可以使用生成器,而不是在内存中创建一个列表然后将其传递给join

    s = ''.join(c for c in s if c.isalpha() or c.isnumeric())
    # note absence of square brackets
    

    【讨论】:

    • 不错的一个!起初我想逐个检查字符,但后来我看到了你的答案并记住了正则表达式的力量
    【解决方案3】:

    我觉得会有点快:

    import re, string
    
    pattern = re.compile('[\W_]+')
    
    with open('file.txt') as f:
        rdstr = f.read()
    
    rdstr = pattern.sub('', rdstr)
    
    print(rdstr)
    

    对于这个txt文件:

    abc342][][]asde34=)$(s)
    

    它会返回

    abc342asde34s
    

    你可以在这里https://repl.it/Ni04/0观看直播

    【讨论】:

      【解决方案4】:

      除了使用 RegEx,您还可以使用 .isalnum() 内置函数而不是检查 .isalpha().isnumeric()

      with open('file.txt') as fin:
          s = fin.read()
          s = ''.join(c for c in s if c.isalnum())
      

      编辑:正如另一位用户提到的,您可以在加入之前删除在文件中创建字符列表的部分。 [] 括号内的 .join() 不是必需的。

      【讨论】:

      • 这个答案与已经提供的代码速度相同。 MISTERCEC 特别要求提供比他们提供的解决方案更快的解决方案
      • 当我自己在一个大文件上测试这个时,它会更快。它只评估 1 个表达式而不是 2 个。他面临的速度问题很可能是因为他的文件有多大,而实际上并没有任何解决方案。所以我提供了一个解决方案,至少有助于字符串解析。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 2012-04-09
      • 2017-09-03
      • 2019-05-26
      • 1970-01-01
      相关资源
      最近更新 更多