簡體   English   中英

正則表達式在雙引號之間提取不超過十個單詞

[英]Regular expression to extract not more than ten words between double quotes

誰能指導我寫一個正則表達式來查找帶引號的字符串中最多十個單詞?

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個單詞的帶引號的字符串

嘗試以下正則表達式:

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

演示正則表達式101

說明:

  • \\"匹配"

  • \\"(\\b\\w+\\b\\s?)匹配一個單詞,后跟空格,空格是可選的

  • {,10}量詞指定少於或等於10
  • \\"匹配最后一個"

如果句子的末尾包含標點符號,則可以用來匹配[\\.\\?\\!]並將其設置為可選

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

說明:

您想在雙引號之間找到最多10個以空格分隔的單詞。 第一個和最后一個"將此表達式限制為僅帶引號的短語。

(不是真的,因為它暗示使用".+"是可行的。但是隨后,您會得到從第一個引號到最后一個引號的整個字符串,因為GREP是Greedy。您可以使用".+?"查找最短的匹配項僅,但是您不能“計算”里面的單詞。)

在第一個引號之后,您要匹配第一個“整個詞”,該詞必須由一系列非空格字符組成: \\S+ 但是,如果您只有一個單詞並在此之后繼續操作,則可能會吃掉雙引號結尾,因此也有必要將其排除在外:

[^\s"]+

-一個或多個包含序列(空格字符或雙引號)的序列。 這將匹配第一個單詞。 然后,可能會出現零個或最多9個“空間-類單詞序列”序列:

\s+[^\s"]+

匹配一次這些事件,並且

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

匹配0到9次出現。

您可能沒有注意到它,但是您自己的嘗試在開頭和結尾處都刪除了雙引號。 那是因為您在正則表達式中使用了括號,並且findall作為group返回它。 為了防止這種情況,我在小組開始時使用?: (沒有這個,您只會得到singer ,這是匹配的最后一組的內容!)

如果您不希望使用引號,請稍后將其刪除,或在整個正則表達式周圍添加新的顯式組:

>>> re.findall(r'"([^\s"]+(?:\s+[^\s"]*){,9})"', string)
['Michael Jackson is a great singer']

默認情況下,正則表達式是貪婪的,這意味着它們將嘗試盡可能地匹配。 然后,您需要做的就是說要使用.*?作為非貪婪匹配者.*? 但這將匹配整個字符串。

因此,您需要創建一個正則表達式,該表達式匹配一個單詞,但不匹配空格,然后匹配最多9個其他字符(以空格開頭)。

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

您的代碼可以編寫如下:

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*" ->匹配引號(”)前的最后一個單詞

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM