regex - 正则表达式问题:对中文汉字和拼音进行排序
问题描述
我正在尝试将汉字和拼音组排序为正确的顺序。例如
得到, 取得, 收到, 到达, 获得 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=收到等。汉字组的数量逐行变化。
如何分别识别拼音组,即把$a=dédào $b=qǔdé 等(或以其他方式区别于汉字组)
如何编写字符串以便它会创建: 得到 dédào, 取得 qǔdé, 收到 shōudào, 拿到替换 nádào, 取得 huòdé。
问题截图:
解决方案
既然您在问题评论中提到:
“这个问题与 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
最后一行表示断言通过,并且已经达到目标。
推荐阅读
- node.js - Nodejs 对象 - 如何同时添加值和定义新属性?
- reactjs - 在另一个库中时反应组件道具更改不会触发 useEffect()
- r - 使用 rbind 或 do.call 在 R 中的 for 循环问题
- vba - 查找数字文本并将其替换为分数文本
- reporting-services - Visual Studio 2017 报告服务。将模板保存在不存在的文件路径中
- arrays - Swift:使用 UUID 从数组中删除重复对象
- excel - Excel VBA函数从一个范围内获取正值
- reactjs - 如果 Next.js ISR 的 revalidate 值为 1 秒在生产中会发生什么?
- node.js - 异步 Json 数组矩阵
- java - 为什么这个最大公约数的输出为 0