正则表达式在双引号之间提取不超过十个单词

时间:2018-10-07 15:20:41

标签: python regex python-3.x regex-group

有人可以引导我写一个正则表达式来查找带引号的字符串中最多十个单词吗?

string = "\"Michael Jackson is a great singer\". There were many rumours about his relationship with his girlfriend.  \"He won many national awards and one of the most famous pop singer in the late 80s and 90s\""
re.findall(r'"(.*)"', string)

上面的正则表达式同时提取两个带引号的字符串,但我只想提取少于10个单词的带引号的字符串

4 个答案:

答案 0 :(得分:2)

尝试以下正则表达式:

\"(\b\w+\b\s?){,10}\"

demo regex 101

说明:

  • \"匹配"

  • \"(\b\w+\b\s?)匹配一个单词,后跟空格,空格是可选的

  • {,10}量词指定少于或等于10个单词
  • \"匹配最后一个"

如果句子的末尾包含标点符号,则可以用来匹配[\.\?\!]并将其设置为可选

\"(\b\w+\b\s?){,10}[\.\?\!]?\"

答案 1 :(得分:1)

re.findall(r'"[^\s"]+(?:\s+[^\s"]+){,9}"', string)

说明:

您想在双引号之间找到最多10个以空格分隔的单词。第一个"和最后一个".+"将此表达式限制为仅带引号的短语。

(并不是真的,因为它暗示使用".+?"是可行的。但是随后您会得到从 first 引号一直到 last 的整个字符串,因为GREP是贪婪的。您只能使用\S+查找最短的 匹配项,但之后您就无法“计数”其中的单词了。)

在第一个引号之后,您要匹配第一个“整个词”,该词必须由一系列非空格字符组成:[^\s"]+ 。但是,如果您只有一个单词,那么可能会吃掉双引号,然后继续,因此有必要将其排除在外:

\s+[^\s"]+

-一个或多个 not (空格字符或双引号)的序列。这将匹配第一个单词。然后,可能会出现零个或最多9个“空间-类单词序列”序列:

(\s+[^\s"]+){,9}

匹配其中的一次,并且

findall

最多匹配0次,最多9次。

您可能没有注意到它,但是您自己的尝试丢弃了在开头和结尾的双引号。这是因为您在正则表达式中使用了括号,并且?:将其作为 group 返回。为了防止这种情况,我在小组开始时使用了singer。 (没有这个,您将只得到>>> re.findall(r'"([^\s"]+(?:\s+[^\s"]*){,9})"', string) ['Michael Jackson is a great singer'] ,这是匹配的最后一组的内容!)

如果您不希望使用引号,请稍后将其删除或在整个正则表达式周围添加一个新的显式组:

+ 0

答案 2 :(得分:0)

默认情况下,正则表达式是贪婪的,这意味着它们将尝试尽可能地匹配。然后,您需要做的就是说要使用.*?作为非贪婪匹配者。但这将匹配整个字符串。

因此,您需要创建一个正则表达式,该词匹配一个单词,但不匹配空格,然后匹配最多9个其他字符(以空格开头)。

构建此文档所需的所有信息都在文档(https://docs.python.org/2/library/re.html)中。

答案 3 :(得分:0)

您的代码可以编写如下:

string = "Michael Jackson is a great singer". There were many rumours about his relationship with his girlfriend.  "He won many national awards and one of the most famous pop singer in the late 80s and 90s"
re.findall(r'"(\w* ){0,9}\w*"', string)

"(\w* ){0,9}->在打开的引号(“)之后匹配0到9个字

\w*"->匹配结束引号(“)前的最后一个单词