【问题标题】:Regex: replace substring to multiple word forms正则表达式:将子字符串替换为多个单词形式
【发布时间】:2015-03-29 12:47:14
【问题描述】:

一些人类语言的特点是达到形态和发达的语法性别系统。例如,在斯拉夫语言中,几乎每个单一语法数字的形容词都有三种不同的形式,根据性别的数量(阳性阴性中性):

white <-> белый (m), белая (f), белое (n)     

在某些情况下,在使用正则表达式进行子字符串替换时获取可能的单词形式列表会很有用。

现在我很好奇,如果 Python(或任何其他脚本语言)允许执行以下操作(警告:下面的代码 sn-ps 是类似于 Python 的 伪代码,但不是可用的 Python 代码):

# I would like to handle russian genders like that:  
>>> re.sub(r"Бел.", r"Бел[ый|ая|ое]", "Бел. Берель")
["Белый Берель", "Белая Берель", "Белое Берель"]

# A very artifical example for those who prefer latin:
>>> re.sub(r"Go.", r"Go[ld|lden]", "Go. Ochre")
["Gold Ochre", "Golden Ochre"] 

那么我可以使用正则表达式来获取匹配的单词组合列表吗?

【问题讨论】:

  • 您的示例中的工作 Python 代码还是所需的代码?
  • 你可以使用循环遍历每个性别,不是吗?
  • 如果您使用[a-zA-Z0-9],而不是西里尔字母,那么了解您想要匹配的内容和想要替换的内容会容易得多。即使这根本没有意义 - 真的很难“阅读”它并看到差异。
  • @AlexeyGorozhanov,这是一个想要的代码
  • @Jerry,我当然可以,但我希望它已经实现并且开箱即用......

标签: python regex linguistics


【解决方案1】:

不,但您可以使用这样的列表推导式迭代后缀列表(对于 Python 2):

>>> suffixes = u'ый|ая|ое'.split('|')
>>> suffixes
[u'\u044b\u0439', u'\u0430\u044f', u'\u043e\u0435']
>>> replacements = [re.sub(u"Бел.", u"Бел%s" % s, u"Бел. Берель") for s in suffixes]
>>> replacements
[u'\u0411\u0435\u043b\u044b\u0439 \u0411\u0435\u0440\u0435\u043b\u044c', u'\u0411\u0435\u043b\u0430\u044f \u0411\u0435\u0440\u0435\u043b\u044c', u'\u0411\u0435\u043b\u043e\u0435 \u0411\u0435\u0440\u0435\u043b\u044c']
>>> for s in replacements:
...     print s
... 
Белый Берель
Белая Берель
Белое Берель

在 Python 3 中更清晰一些:

>>> suffixes = u'ый|ая|ое'.split('|')
>>> suffixes
['ый', 'ая', 'ое']
>>> >>> suffixes = u'ый|ая|ое'.split('|')
>>> suffixes
[u'\u044b\u0439', u'\u0430\u044f', u'\u043e\u0435']
>>> replacements = [re.sub("Бел.", "Бел%s" % s, "Бел. Берель") for s in suffixes]
>>> replacements
['Белый Берель', 'Белая Берель', 'Белое Берель']

【讨论】:

    【解决方案2】:

    感谢您的拉丁语示例!

    我会为所有可能的情况使用循环:

    import re 
    
    str = "Go. Ochre"
    
    find_list = [r'Go.']
    replace_list = ['Gold', 'Golden']
    
    for value in find_list:
        for item in replace_list:
            print re.sub(value, item, str)
    

    我不确定这是否真的是您想要的 - 我对这种方法的效率知之甚少。

    但它是非常易读的代码,易于维护 - 并且可以很容易地编写为通用的可重用函数。


    ...对于这个例子,最好只使用replace() 字符串 - 不需要正则表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-17
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 2018-07-13
      • 2017-02-04
      相关资源
      最近更新 更多