有没有一种方法可以从字符串中删除特定的标点符号组合?

3
我一直在迭代我爬取的源码,我需要的部分数据非常接近正确,但是我无法将最后一部分整理干净。是否有以下问题的简单解决方法?
我尝试使用re和join,但由于标点符号的显示方式不同,它们都无法正常工作。
I want to turn this:
"['Coming To ', America]", "['Captain ', America, ': The Winter...']", 
"[America, 'n Pie']", "[America, 'n Made']"

Into this:
'Coming To America', 'Captain America: The Winter...', 'American Pie', 
'American Made'

要匹配您想要删除的字符,正则表达式应为:(["[}+)(["]]+)。但是,您输入的格式很重要,它是一个数组吗? - InfiniteHigh
这是一个列表,我正在循环遍历它以构建元组列表。在构建元组列表时,我正在迭代该列表。 - cmorph1
4个回答

1

在列表上使用 map(),并在列表中的每个字符串上使用 filter()

lst = ["['Coming To ', America]", "['Captain ', America, ': The Winter...']", 
    "[America, 'n Pie']", "[America, 'n Made']"]
punct = set(list("[],'\n"))
print(list(
    map(lambda s: ''.join(filter(lambda c: c not in punct, s)), lst)
))

输出:

['Coming To  America', 'Captain  America : The Winter...', 'America n Pie', 'America n Made']

如果您想删除其他字符,只需将它们添加到punct中即可。


问题在于我留下了许多不需要的空格。感谢您的输入。 - cmorph1
那么你的问题不仅仅是要去掉标点符号,它比那要难得多。例如,拿America n Pie来说,程序怎么知道你的意思是american pie?如果真的是要表达America n Pie呢? - sam46
没错,我已经从一个更复杂的结构迭代到了这个。但是,可能是我之前犯了一个错误,现在无法得到我想要的结果。 - cmorph1
你所需要的更多是自然语言处理问题。 - sam46
结果发现我使用的是BeautifulSoup中的.content而不是.text。无论如何,感谢你的帮助! - cmorph1

1

由于您可能正在从文件中读取Python代码,因此应使用eval作为计算所需内容的最通用方法。

这样可以避免每次出现新字符(例如制表符或括号)时添加一个新行或替换,但如果您对自己所做的事情不小心,这也会导致安全漏洞。

eval函数允许Python程序在自身内部运行Python代码。

您需要定义变量America,使其成为有效的Python语句,然后可以将其eval为列表,然后连接每个部分。

s = ["['Coming To ', America]", "['Captain ', America, ': The Winter...']", "[America, 'n Pie']", "[America, 'n Made']"]
America = 'America'
for x in s:
    print(''.join(eval(x)))

输出:
Coming To America
Captain America: The Winter...
American Pie
American Made

那个 eval 函数看起来非常方便!谢谢伙计。 - cmorph1
eval函数是很危险的,我认为最好使用其他解析函数,比如“json.loads”或“ast”。 - iElden

1

虽然使用ast可能有些过度,但无论如何,这里是一种方法:

import ast

# AST visitor that transforms names into strings
class NamesAsStrings(ast.NodeTransformer):
    def visit_Name(self, node):
        return ast.copy_location(ast.Str(
            s=node.id,
            ctx=node.ctx
        ), node)

ss = ("['Coming To ', America]",
      "['Captain ', America, ': The Winter...']",
      "[America, 'n Pie']",
      "[America, 'n Made']")
visitor = NamesAsStrings()
strs = [''.join(ast.literal_eval(visitor.visit(ast.parse(s)).body[0].value)) for s in ss]
print(*strs, sep='\n')

输出:

Coming To America
Captain America: The Winter...
American Pie
American Made

这仅在非字符串元素(此处为 America)是有效的 Python 名称时才起作用。然而,它的优点是可以正确处理字符串中的转义字符。


ast看起来像是一个方便的函数。看到不同的解决问题的方法总是很好的。谢谢伙计。 - cmorph1

0
你需要的函数是字符串的replace方法。
它的语法如下:
newString = oldString.replace("oldSubstring", "newSubstring")

因此,使用它来解决您的问题将如下所示:

a = ["['Coming To ', America]", "['Captain ', America, ': The Winter...']",  "[America, 'n Pie']", "[America, 'n Made']"]

result = []
toRemove = ["', ", ", '", "'", "[", "]"]
for element in a:
  b = element
  for punct in toRemove:
    b = b.replace(punct, "")
  result.append(b)
print("\n".join(result))

请注意,这不会给出正确的输出,你仍然有方括号。 - BlueSheepToken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接