簡體   English   中英

用於解析單詞結構的正則表達式

[英]Regular expression to parse word structure

我正在嘗試構建我的第一個非平凡的正則表達式(用於Python),但正在努力。

讓我們假設語言X(不是英語)中的單詞是最小“結構”的序列。 每個'結構'可以是:

An independent vowel (basically one letter of the alphabet)
A consonant (one letter of the alphabet)
A consonant followed by a right-attaching vowel
A left-attaching vowel followed by a consonant
(Certain left-attaching vowels) followed by a consonant followed by (certain right-attaching vowels)

例如,這個3個字的單詞:

<a consonant><a left-attaching vowel><an independent vowel>

不是一個有效的單詞,並且不應該與正則表達式匹配,因為左附加元音的右邊沒有輔音。

我知道所有Unicode范圍 - 輔音,獨立元音,左連元音等的Unicode范圍。

這是我到目前為止:

WordPattern = (
ur'('
ur'[\u0985-\u0994]|'
ur'[\u0995-\u09B9]|'
ur'[\u0995-\u09B9(\u09BE|[\u09C0-\u09C4])]|'
ur'[(\u09BF|\u09C7|\u09C8)\u0995-\u09B9]|'
ur'[(\u09BF|\u09C7|\u09C8)\u0995-\u09B9(\u09BE|[\u09C0-\u09C4])]'
ur')+'
)

它不起作用。 除了讓它工作,我有三個具體問題:

  • 我需要將正則表達式拆分為多行,否則代碼看起來會很糟糕。 我該怎么做呢?
  • 我想使用某種字符串替換/模板來“命名”Unicode范圍,以獲得代碼可讀性並防止多次鍵入Unicode范圍。
  • (這似乎非常困難)允許的最小“結構”列表必須在以后擴展。 有沒有辦法在正則表達式中設置一種“循環”機制,以便它適用於列表中的所有允許結構?

任何幫助,將不勝感激。 這對初學者來說似乎非常復雜!

用於具有非平凡形態的語言的形態分析的適當工具是“有限狀態傳感器”。 您可以跟蹤和使用強大的實現(一個由Xerox Parc提供)。 有一個有python綁定(用作外部庫)。 谷歌一下。

FST基於有限狀態自動機,如(純)正則表達式,但它們絕不是替代品。 這是復雜的機器,所以如果你的目標很簡單(例如,用於連字的音節),你可能想要尋找更簡單的東西。 例如,有機器學習算法將“學習”連字符。 如果您確實對形態分析感興趣,那么您必須努力查看FST。

現在對於你的算法,如果你真的只需要一個簡單的實現:由於任何元音或輔音可以是獨立的,你的規則是模糊的:它們允許“ab”被解析為“ab”。 這種模糊性意味着regexp方法可能永遠不會起作用,但是如果你把較長的regexp放在第一位,你可能會得到更好的結果,因此當它們都適用時,它們會優先於短的regexp。 但實際上你需要構建一個解析器(手動或使用模塊)並逐步嘗試不同的東西。 它與你想象的相反:設置一個使用不同正則表達式的循環,並逐步“消耗”字符串。

然而,在我看來,你所描述的基本上是音節化。 並且近似普遍的音節規則是這樣的:一個音節由一個核心元音組成,加上許多先前(“起始”)輔音,如語言允許的規則,加上任何不屬於下一個音節的輔音。 該規則被稱為“最大化開始”,其結果是更容易向后解析您的音節(從單詞的結尾)。 試試看。

PS。 您可能知道這一點,但如果您將以下內容作為腳本中的第二行,則可以將孟加拉語嵌入到正則表達式中:

# -*- coding: utf-8 -*-
  • 我需要將正則表達式拆分為多行,否則代碼看起來會很糟糕。 我該怎么做呢?

編譯正則表達式時使用re.VERBOSE標志。

pattern = re.compile(r"""(
                            [\u0985-\u0994]  # comment to explain what this is
                          | [\u0995-\u09B9]
                          # etc.
                         )
                      """, re.VERBOSE)
  • 我想使用某種字符串替換/模板來“命名”Unicode范圍

您可以從普通的Python字符串構造RE:

>>> subpatterns = {"vowel": "[aeiou]", "consonant": "[^aeiou]"}
>>> "{consonant}{vowel}+{consonant}*".format(**subpatterns)
'[^aeiou][aeiou]+[^aeiou]*'
  • 允許的最小“結構”列表必須在以后擴展。 有沒有辦法在正則表達式中設置一種“循環”機制,以便它適用於列表中的所有允許結構?

我不確定我是否理解你的意思,但是......假設你有一個(未編譯的)RE列表,比如patterns ,那么你可以用它來計算它們的聯合

re.compile("(%s)" % "|".join(patterns))

在以這種方式構造RE時要小心特殊字符,並在必要時使用re.escape

暫無
暫無

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

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