我没有得到regex表达式所期望的结果

sycxhyv7  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(84)

我在text6中查找包含z或pt字符序列或以ize结尾的单词
我写了以下内容,但它包括许多不符合上述标准的单词,如安抚,舞蹈,进攻,执行。为什么会这样?

L2=[w for w in text6 if re.search(r".*[z]|.*[p][t]|[ize]$",w)

在上一个练习的基础上提出的另一个问题:我需要添加一个新的替代条件,即。单词以1开头,只有一个大写字母。
我写了

L2=[w for w in text6 if re.search(r"[A-Z]{1}|.*[z]|.*[p][t]|[ize]$",w)

它还包括大写字母的单词(即大写字母中的所有字符)
我该如何解决这些问题?

7ivaypg9

7ivaypg91#

这里我建议使用非正则表达式的方法,因为正则表达式看起来比这个用例要求的更复杂。
首先,您可以摆脱“以ize结尾”的约束,因为它福尔斯任何包含z的单词。

text6 = [
    'appease', 'dance', 'offensive', 'executive',
    'inept', 'zoo', 'Inept', 'Zoo', 'INept', 'ZOo']

仅匹配小写的ptz

[w for w in text6 if 'pt' in w or 'z' in w]  # ['inept', 'zoo', 'Inept', 'INept']

为了匹配上述大小写以及仅大写的单词:

[w for w in text6 if w.istitle() and ('pt' in w or 'z' in w)]  # ['Inept']

当然,最好写一个函数把这个逻辑抽象出来:

def meets_criteria(word):
    return word.istitle() and ('pt' in word or 'z' in word)

[w for w in text6 if meets_criteria(w)]

如果您还想匹配以ZPt开头的单词,则可以在w.lower()中检查成员关系。

zhte4eai

zhte4eai2#

你是在字符而不是单词上迭代,在这种情况下,你需要分割你的文本。
你也可以在没有正则表达式的情况下完成所有这些工作:

from string import ascii_uppercase

def check_word(word):
    return 'z' in word or 'pt' in word or word.endswith('ize') or word.startswith(tuple(ascii_uppercase))

[w for w in text6.split() if check_word(w)]

演示:

>>> text6 = "here are some example: appease dance offensive xxxize executive and other extra words optimum Python"
>>> [w for w in text6.split() if check_word(w)]
['xxxize', 'optimum', 'Python']

对于最后一个条件(* 单词以1开头,只有1个大写字母 *),如果你不想在单词中使用大写字母,除了第一个,你可以添加(word[1:].islower())到check_word函数:

def check_word(word):
    return 'z' in word or 'pt' in word or word.endswith('ize') or (word.startswith(tuple(ascii_uppercase)) and word[1:].islower())
  • 注意 *:如果你想用多个分隔符或基于其他条件来分隔单词,你可以使用re.findall()来查找单词。

例如,下面的正则表达式将缠绕包含单词字符的单词:

re.findall(r'\b\w+\b', my_str)
gzjq41n4

gzjq41n43#

您正在寻找的是:

[w for w in text6 if re.search(r"z|pt|ize$", w)]

这将捕获所有需要的单词。注意,最后一部分不是必需的,因为任何匹配ize$的单词也将匹配z。所以本质上,表达式可以归结为:

[w for w in text6 if re.search(r"z|pt", w)]

第二种情况可以通过使用表达式^[A-Z]{1}[^A-Z]来解决。那就是

  • 以一个大写字母开头
  • 后面不跟大写字母

这在下面使用:

[w for w in text6 if re.search(r"^[A-Z]{1}[^A-Z]|z|pt|ize$", w)]

或者简单地说

[w for w in text6 if re.search(r"^[A-Z]{1}[^A-Z]|z|pt", w)]

相关问题