【问题标题】:How to remove all non-alphabetic characters from a string?如何从字符串中删除所有非字母字符?
【发布时间】:2018-07-27 15:12:01
【问题描述】:

我一直在开发一个将采用十六进制文件的程序,如果文件名以“CID”开头,那么它应该删除前 104 个字符,然后是几个单词。我也想删除单词后面的所有内容,但问题是我要隔离的部分长度不同。

我的代码目前是这样的:

y = 0
import os
files = os.listdir(".")

filenames = []
for names in files:
    if names.endswith(".uexp"):
        filenames.append(names)
        y +=1
        print(y)
print(filenames)

for x in range(1,y):
    filenamestart = (filenames[x][0:3])
    print(filenamestart)
    if filenamestart == "CID":
        openFile = open(filenames[x],'r')
        fileContents = (openFile.read())
        ItemName = (fileContents[104:])
        print(ItemName)

输入示例文件(从 HxD 中提取):

.........................ýÿÿÿ................E.................!...1AC9816A4D34966936605BB7EFBC0841.....Sun Tan Specialist.................9.................!...9658361F4EFF6B98FF153898E58C9D52.....Outfit.................D.................!...F37BE72345271144C16FECAFE6A46F2A.....Don't get burned............................................................................................................................Áƒ*ž

我已经删除了前 104 个字符,但我还想删除“Sun Tan Specialist”之后的字符,因为长度会有所不同,所以我只剩下那部分了。

感谢任何人能给我的任何帮助。

【问题讨论】:

  • 您的问题标题是“从字符串中删除非字母字符”。从您问题的内容来看,似乎还有更多的要求。请通过示例输入、所需输出和minimal reproducible example 进行澄清
  • 我添加了一个示例文件以及我希望输出的内容
  • 那么你想要的输出是什么?只是Sun Tan Specialist?
  • 试试re.sub(r'(.*?)(\..*)', r'\1', s[104:])
  • 在这一点上是的,但理想情况下我想:“晒黑专家 | 不要被烫伤”

标签: python hex hexdump


【解决方案1】:

删除字符串中的非字母字符的一种方法是使用正则表达式 [1]。

>>> import re
>>> re.sub(r'[^a-z]', '', "lol123\t")
'lol'

编辑

第一个参数r'[^a-z]' 是捕获将要删除的内容的模式(在这里,通过将其替换为空字符串'')。方括号用于表示一个类别(该模式将匹配该类别中的任何内容),^ 是“非”运算符,a-z 表示所有小型大写字母字符。更多信息在这里:

https://docs.python.org/3/library/re.html#regular-expression-syntax

例如,要保留大写字母和空格,它会是:

>>> re.sub(r'[^a-zA-Z ]', '', 'Lol !this *is* a3 -test\t12378')
'Lol this is a test'

但是从您在问题中提供的数据来看,您需要的确切过程似乎比“摆脱非字母字符”要复杂一些。

【讨论】:

  • 这可能是一种可能,但是我也想保留大写字母和空格,我该怎么做?
【解决方案2】:

你可以使用filter:

import string
print(''.join(filter(lambda character: character in string.ascii_letters + string.digits, '(ABC), DEF!'))) # => ABCDEF

【讨论】:

    【解决方案3】:

    你在评论中提到你得到了Sun Tan SpecialistFEFFBFFECDOutfitDFBECFECAFEAFADont get burned的字符串

    此时基本上您的目标是删除任何不紧跟小写字母的大写字母,因为 Upper Lower 表示短语的开头。您可以使用 for 循环来执行此操作。

    import re
    
    h =  "Sun Tan SpecialistFEFFBFFECDOutfitDFBECFECAFEAFADont get burned"
    
    output = ""
    for i in range(0, len(h)):
        # Keep spaces
        if h[i] is " ":
            output += h[i]
        # Start of a phrase found, so separate with space and store character
        elif h[i].isupper() and h[i+1].islower():
            output += " " + h[i]
        # We want all lowercase characters
        elif h[i].islower():
            output += h[i]
    
    # [1:] because we appended a space to the start of every word
     print output[1:]
     # If you dont care about Outfit since it is always there, remove it
     print output[1:].replace("Outfit", "")
    

    输出:

    晒晒专家装别被烫

    晒晒专家别烫伤

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-26
      • 2018-12-02
      • 2013-04-30
      • 2013-01-19
      • 1970-01-01
      • 2015-02-26
      • 2015-11-14
      • 2022-01-09
      相关资源
      最近更新 更多