1 回答

TA貢獻1824條經驗 獲得超8個贊
這是通過 Pythonre
庫使用正則表達式對您所要求的內容進行粗略的近似。
import?re m?=?re.match(r'(?:\{[^-#{}/]+\})?(?:([^-#{}/]+)-)?([^-#{}/]+)(?:/[^-#{}/]+)?(?:#([^-#{}/]+))?',?word) if?m: ????prefix,?root,?suffix?=?m.groups()
您的示例似乎也有=
和|
作為分隔符,但是一旦您了解了它是如何工作的,擴展它以允許這些分隔符應該相對簡單。
簡而言之,如果正則表達式不匹配,則re.match()
返回False
,否則返回一個匹配對象,該對象的.groups()
方法包含與正則表達式中分組括號匹配的文本。(?:...)
括號是非分組的,括號中沒有?:
緊跟在左括號后面的捕獲成組。
表達式可以分為以下幾種:
(?:\{[^-#{}/]+\})?
- 非分組表達式可跳過其中的任何內容{braces}
(?:([^-#{}/]+)-)?
- 破折號之前任何內容的分組表達式的非分組包裝器-
([^-#{}/]+)
- 主根 - 分組表達式以捕獲與分隔符之一不匹配的文本(?:/[^-#{}/]+)?
- 非分組表達式忽略斜杠后的任何內容(?:#([^-#{}/]+))?
- 與破折號類似,捕獲 后的任何后綴#
,用非分組包裝器圍繞整個組,然后對分隔符后的文本進行分組捕獲
乍一看這似乎令人生畏,但是一旦您破譯了第一對,您就應該了解它們是如何工作的。讓我們更詳細地檢查一下破折號表達式。
(?:
- 我們需要一個非捕獲組將所有這些標記為可選,放在最后(
- 將分組括號之間的任何匹配文本捕獲到.group()
[^-#{}/]
- 匹配不是-
or?#
or?{
or or?}
or的單個字符/
+
- 實際上,前面的一個或多個,盡可能多)
- 捕獲結束-
- 只要所有這些都以破折號結尾-
)?
- 所有這些都是可選的;如果跳過此步驟將允許整體表達式匹配,則正則表達式引擎會(但如果可能的話,它仍然會更喜歡匹配 - 這稱為“貪婪匹配”)。
請注意如何[^-#{}/]+
不斷出現在所有這些組中。我們不想讓我們捕獲的文本與分隔符之一匹配。
您沒有指定如何處理空格,因此這只是將它們視為任何其他字符。也許您也想在它們與分隔符相鄰時將它們排除在組之外?
添加回答
舉報