首页 > 解决方案 > 正则表达式问题:对中文汉字和拼音进行排序

问题描述

我正在尝试将汉字和拼音组排序为正确的顺序。例如

得到, 取得, 收到, 到达, 获得 dédào, qǔdé, shōudào, nádào, huòdé.
=> 得到 dédào, 取得 qǔdé, 收到 shōudào, 到达 nádào, 获得 huòdé.

我为此目的使用 Libreoffice,它接受正则表达式。问题是,我不知道如何编写合适的正则表达式。

到目前为止,我已经创建了这个: ^([一-龥]+)[,] 将 $1=返回(这很好)

剩下的问题: 1. 如何识别其余的汉字组,即把$2=取得,$3=收到等。汉字组的数量逐行变化。

  1. 如何分别识别拼音组,即把$a=dédào $b=qǔdé 等(或以其他方式区别于汉字组)

  2. 如何编写字符串以便它会创建: 得到 dédào, 取得 qǔdé, 收到 shōudào, 拿到替换 nádào, 取得 huòdé。

问题截图:

问题截图1 问题2截图

标签: regexlibreoffice

解决方案


既然您在问题评论中提到:

“这个问题与 Libreoffice 没有特别的关系。相反,它是关于如何形成正确的正则表达式”,

我选择使用 Python 来解决这个问题。Python 可以使用正则表达式和 zhon ( https://zhon.readthedocs.io/en/latest/ ) 来做到这一点:

import re

from zhon import hanzi, pinyin

text = "得到, 取得, 收到, 拿到, 获得 dédào, qǔdé, shōudào, nádào, huòdé."
target = "得到 dédào, 取得 qǔdé, 收到 shōudào, 拿到 nádào, 获得 huòdé."

hanzi_char = re.findall('[%s]' % hanzi.characters, text)
pinyin_word = re.findall(pinyin.word, text, re.I)

print(f"{text = }")

print(f"{hanzi_char = }")
print(f"{pinyin_word = }")

comb_hanzi_char = [i + j
                   for i, j in zip(hanzi_char[0:10:2],
                                   hanzi_char[1:11:2]
                                  )
                   ]

print(f"{comb_hanzi_char = }")

res = [hanzi + ' ' + pinyin
       for hanzi, pinyin in zip(comb_hanzi_char, pinyin_word)
       ]

res = ', '.join(res) + '.'

print(f"\n{target = }")
print(f"{res = }")

assert(res == target)

回报:

text = '得到, 取得, 收到, 拿到, 获得 dédào, qǔdé, shōudào, nádào, huòdé.'
hanzi_char = ['得', '到', '取', '得', '收', '到', '拿', '到', '获', '得']
pinyin_word = ['dédào', 'qǔdé', 'shōudào', 'nádào', 'huòdé']
comb_hanzi_char = ['得到', '取得', '收到', '拿到', '获得']

target = '得到 dédào, 取得 qǔdé, 收到 shōudào, 拿到 nádào, 获得 huòdé.'
res = '得到 dédào, 取得 qǔdé, 收到 shōudào, 拿到 nádào, 获得 huòdé.'

Process finished with exit code 0

最后一行表示断言通过,并且已经达到目标。


推荐阅读