我没有得到正则表达式的预期

时间:2016-08-27 16:51:51

标签: python regex

我正在寻找text6中包含z或字符序列pt或以ize结尾的单词

我写了以下内容,但其中包含许多不符合上述标准的词语,如安抚,舞蹈,冒犯,执行.......为什么会这样?

SELECT SUM(`Qty in acquisto`) AS total,`Prezzo in acquisto` 
FROM `book` 
GROUP BY `Qty in acquisto` 
HAVING COUNT(*) >5

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

我写了

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

它还包括大写单词(即大写字母中的所有字符)

这两个问题可以帮助吗?

提前谢谢

莫罗

3 个答案:

答案 0 :(得分:2)

您正在迭代字符而非字词,因此您需要拆分文字。

你也可以在没有正则表达式的情况下完成所有这些工作:

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)

答案 1 :(得分:2)

我建议使用非正则表达式方法,因为正则表达式似乎比这个用例要求更复杂。

首先,您可以摆脱“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()中的成员资格。

答案 2 :(得分:1)

您正在寻找的是:

[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)]