当前位置: 首页 > 知识库问答 >
问题:

正则表达式从列表中删除非字母单词A-Z a-z(异常)

屈俊远
2023-03-14

我试图从包含非alpha字符的字符串列表中删除单词,例如:

["The", "sailor", "is", "sick", "."] -> ["The", "sailor", "is", "sick"]

但我不能随意删除包含非alpha字符的单词,因为可能出现以下情况:

["The", "U.S.", "is", "big", "."] -> ["The", "U.S.", "is", "big"] (acronym kept but period is removed)

我需要想出一个正则表达式或类似的方法来处理这样的简单情况(所有类型的标点符号):

["And", ",", "there", "she", "is", "."] -> ["And", "there", "she", "is"]

我使用一个自然语言包装类将句子转换为左侧的列表,但有时列表要复杂得多:

string:   "round up the "blonde bombshells' a all (well almost all)"
list: ["round", "up", "the", "''", "blonde", "bombshell", "\\", 
          "a", "all", "-lrb-", "well", "almost", "all", "-rrb-"]

正如您所看到的,一些字符(如括号和撇号)被包装器转换或删除。我想将所有这些无关的子字符串处理成一个更干净的外观:

list: ["round", "up", "the", "blonde", "bombshell",
          "a", "all", "well", "almost", "all"]

我对python相当陌生,我的印象是,正则表达式将是我在这里的最佳方法,但不知道如何将第一个列表转换为经过清理的第二个列表,如果您能提供帮助,我将不胜感激!

共有3个答案

孔和风
2023-03-14

通过确保每个字符串至少包含一个字母数字:

import re

expr = re.compile(r"\w+")
test = ["And", ",", "there", "she", "is", ".", "U.S."]

filtered = [v for v in test if expr.search(v)]
print(filtered)

印刷品

['And', 'there', 'she', 'is', 'U.S.']

备选方案是排除数字,并确保字符串不以非字母字符开头:

# only alpha
expr = re.compile(r"[a-zA-Z]+")
test = ["round", "up", "the", "''", "blonde", "bombshell", "\\",
        "a", "all", "-lrb-", "well", "almost", "all", "-rrb-"]
# use match() here
filtered = [v for v in test if expr.match(v)]
print(filtered)

印刷品

['round', 'up', 'the', 'blonde', 'bombshell', 'a', 'all', 'well', 'almost', 'all']
姜增
2023-03-14

可以使用标点符号执行此操作:

>>> from string import punctuation
>>> [i for i in lst if i not in punctuation]   
['The', 'U.S.', 'is', 'big']
万明辉
2023-03-14

这似乎符合您的描述:

cases=[
    ["The", "sailor", "is", "sick", "."],
    ["The", "U.S.", "is", "big", "."],
    ["round", "up", "the", "''", "blonde", "bombshell", "\\", 
    "a", "all", "-lrb-", "well", "almost", "all", "-rrb-"],
]

import re

for li in cases:
    print '{}\n\t->{}'.format(li, [w for w in li if re.search(r'^[a-zA-Z]', w)])

印刷品:

['The', 'sailor', 'is', 'sick', '.']
    ->['The', 'sailor', 'is', 'sick']
['The', 'U.S.', 'is', 'big', '.']
    ->['The', 'U.S.', 'is', 'big']
['round', 'up', 'the', "''", 'blonde', 'bombshell', '\\', 'a', 'all', '-lrb-', 'well', 'almost', 'all', '-rrb-']
    ->['round', 'up', 'the', 'blonde', 'bombshell', 'a', 'all', 'well', 'almost', 'all']

如果正确,您可以在没有正则表达式的情况下完成:

for li in cases:
    print '{}\n\t->{}'.format(li, [w for w in li if w[0].isalpha()])
 类似资料:
  • 我想删除字符串中的单词列表 我使用了两种方法来实现这一点,一种是linq,另一种是regex 现在看来,regex的性能更好了,例如,这段代码的输出是: LINQ:Mortal Kombat 1 H 264 正则表达式:Mortal Kombat 264 现在的问题是为什么在regex方法中没有移除H.264?(仅去除H.) 在性能速度方面,哪种方法更好? regex中使用的方法是否正确?能不能改

  • 我正在尝试抓取模式中第一个连字符之后的文本 但在此模式中: 我希望它跳过‘不想要的’文本,并匹配的文本后面的下一个连字符(DesiredText)。我创建了一个具有两种模式regex101,并需要修改我的基本regex,以便如果中存在一个或多个我不想匹配的单词,那么它将匹配第二个连字符文本: https://regex101.com/r/vesqh3/1

  • 我需要找到在字符串中出现字母a-z的小写单词的索引。但是,字符串中可能有一堆非字母字符。 例如,单词“don't”跨越短语“don't that”中的索引 [0, 5)。 我四处搜索匹配非字母字符的方法,并使用以下正则表达式实现了这一点: 有没有更简洁的方法来表达这个正则表达式?或者,我必须编写代码在要搜索的每个单词的每个字符之间插入[^a-z]*? 对不起,如果这个问题已经存在-我不知道如何准确

  • 我在PowerGrep中使用这个正则表达式,(这个正则表达式搜索字符串实验室拉德TRAN) 搜索和删除包含字符串或部分字符串的纯文本行,效果很好。 现在我需要更多的东西。我想保留单词LABER,但删除所有其他包含LAB的字符串,例如LABOR、LAB1、ALAB、ALABA等。有没有办法“保护”字符串LABER并删除所有其他包含LAB的字符串?试图使用更改上述正则表达式,但它始终包含我需要保留的单

  • 描述 (Description) 字符类[a-zA-Z]匹配从a到z或A到Z的任何字符。 例子 (Example) 以下示例显示了字符类匹配的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CharacterClassDemo { p

  • 问题内容: 这是我的代码,以确定一个单词是否包含任何非字母数字字符: 我想知道正则表达式是否错误。我知道会匹配任何非单词字符。关于我所缺少的任何想法? 问题答案: 将您的正则表达式更改为: