python - 解析词结构的正则表达式

标签 python regex unicode pattern-matching

我正在尝试构建我的第一个非平凡的正则表达式(用于 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 绑定(bind)(用作外部库)。谷歌一下。

FST 基于有限状态自动机,类似于(纯)正则表达式,但它们绝不是直接替代品。它是复杂的机器,所以如果您的目标很简单(例如,为了连字符的目的而进行音节化),您可能想要寻找更简单的东西。例如,有一些机器学习算法可以“学习”断字。如果您确实对形态分析感兴趣,您必须努力研究 FST。

现在对于你的算法,如果你真的只需要一个简单的实现:因为任何元音或辅音都可以是独立的,你的规则是模棱两可的:它们允许“ab”被解析为“a-b”。这种歧义意味着正则表达式方法可能永远都行不通,但如果将较长的正则表达式放在首位可能会获得更好的结果,因此当两者都适用时,会优先使用它们而不是较短的正则表达式。但实际上你需要构建一个解析器(手动或使用模块)并逐步尝试不同的事情。这与您的想象相反:设置一个使用不同正则表达式的循环,并逐步“消耗”字符串。

但是,在我看来,您所描述的本质上是音节化。几乎通用的音节化规则是这样的:一个音节由一个核心元音、语言规则允许的尽可能多的前面(“起始”)辅音以及任何不能属于下一个音节的后续辅音组成。该规则称为“最大起始”,其结果是更容易向后解析音节(从词尾开始)。试试吧。

附言。您可能知道这一点,但是如果您将以下内容作为脚本的第二行,您就可以将孟加拉语嵌入到您的正则表达式中:

# -*- coding: utf-8 -*-

关于python - 解析词结构的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10173896/

相关文章:

python - 更改默认摘要方法是危险的

regex - 为什么 Text.Regex.Posix =~ 用\d 匹配字符?

regex - 在 linux bash 中使用正则表达式更改输出文件名

windows - 更新一个 unicode 文件给我汉字

python - 最大 unicode 代码点的索引

python - SqlAlchemy,生成的对象 Id 和 Zope 事务

python - PyMC3 在 Possion 模型创建期间生成错误

python - 无法运行树懒注释工具

ios - 如何重置 NSTextStorage 中的属性

python - 如何引发包含 Unicode 字符串的异常?