正则匹配带声调的汉语拼音
>本文由平方X发表于平方X网,转载请注明出处。[http://blog.pingfangx.com/2387.html](http://blog.pingfangx.com/2387.html)
如果不带声调的话,还可以将声母、韵母列出来,可是加上声调就多了啊。
于是想只用声母匹配
```
initial_consonant = 'zh|ch|sh|'
p_pinyin = re.compile(r'%s.*' % initial_consonant)
```
这样后面的话,贪婪会把整串拼音都匹配了,懒惰又只能匹配一个字母
改为后面不能是声母,这里因为要取字符,所有不能用(?!),用的[^]
```
initial_consonant = 'zh|ch|sh|'
p_pinyin = re.compile(r'%s[^bpmfdtnlgkhjqxzcsryw]+' % initial_consonant)
```
还是不行,后面也可能会包含声母的,如 dian 还包含 n
于是改为逆向的匹配,不知道正则有没有逆向匹配的方法,自己没找到,只好逆向截取字符串进行匹较。
```
initial_consonant = 'zh|ch|sh|'
p_pinyin = re.compile(r'(%s)(?!%s)+' % (initial_consonant, initial_consonant))
```
这样匹配时,遇到 zhi、chi、shi 只能匹配出 hi,于是改为
```
p_pinyin = re.compile(r'(?<!)(%s)(?!%s)+' % (initial_consonant, initial_consonant))
```
可是还是不行,因为逆向截取的时候并没有截到前面的 zcs ,所以只能再加一个字符串截取到它之前。
最终结果
```
@staticmethod
def split_pinyin(pinyin):
"""分割拼音"""
result = list()
while pinyin:
pinyin, last_pinyin = PinyinFilter.get_last_pinyin(pinyin)
result.insert(0, last_pinyin)
return result
@staticmethod
def get_last_pinyin(pinyin):
"""
获取最后一个拼音,返回除最后一个拼音外剩下的拼音,以及最后一个拼音
:param pinyin: 要截取的字符串
:return: (剩余拼音,最后一个拼音)
"""
initial_consonant = 'zh|ch|sh|'
# 前面是声母,后面不能跟声母
p_pinyin = re.compile(r'(?<!)(%s)(?!%s)+' % (initial_consonant, initial_consonant))
# 如zhi chi shi ,要加上这个判断才能匹配出 zhi ,否则会直接认为是 hi
p_pinyin2 = re.compile(r'[^zcs]')
length = len(pinyin)
# 从1开始,因为一个声母不算拼音
for i in range(1, length):
if i == length - 1:
# 最后一个单词了
return None, pinyin
else:
sub_word1 = pinyin[-i - 1:]
sub_word2 = pinyin[-i - 2:-i - 1]
if re.match(p_pinyin, sub_word1) and re.match(p_pinyin2, sub_word2):
return pinyin[:length - len(sub_word1)], sub_word1
```
# Talk is cheap
[相关源码](https://github.com/pingfangx/PythonX/blob/feature-pinyin_splitter/ToolsX/pinyin_splitter/pinyin_splitter.py)
相关博文
[大观楼长联原文、注音及释义](http://blog.pingfangx.com/2386.html)
页:
[1]