列出具有相同结尾正则表达式的unicode单词

时间:2015-01-28 17:12:25

标签: python regex unicode

我试图列出使用正则表达式获得一个模式的所有Unicode单词。但它并没有贬低这些词语,而是删除了第一部分。 这是我的代码

import re
string = ["മാണിയുടെ സംഭാഷണങ്ങള്‍ അടങ്ങിയ ","മന്ത്രിയുടെ സംഭാഷണങ്ങള്‍ അടങ്ങിയ", "ഉണ്ണിയുടെ സംഭാഷണങ്ങള്‍ അടങ്ങിയ ","രമേശ്യുടെ സംഭാഷണങ്ങള്‍ അടങ്ങിയ"]
print(type(string))
rePat = re.compile(u'[^യുടെ]',re.UNICODE)
print (rePat.sub("", str(string)))

预期结果是

മാണിയുടെ
മന്ത്രിയുടെ
ഉണ്ണിയുടെ

但是 我得到യുടെ三次 这里的逻辑错误是什么?

3 个答案:

答案 0 :(得分:1)

您匹配的每个字符都不是യുടെ,而是用空字符串替换该字符。因此,യുടെ中每个字符的次出现可能会保留在结果字符串中!

模式[^യുടെ]表示“任何单个字符除了在插入符后列出的字符”,在此上下文中表示“不是”。你在Q的主题中提到“结束”,但这与你实际使用的模式无关。

此外,当你将列表(令人困惑地命名为string! - )转换为一行中的单个字符串时,我很困惑为什么你会期望几行输出。一旦你获得了正确的模式,你最好将它应用于for循环或列表理解中列表的每个项目。

答案 1 :(得分:0)

您可以使用re.findall代替将字符串替换为

import re
string = ["മാണിയുടെ സംഭാഷണങ്ങള്‍ അടങ്ങിയ ","മന്ത്രിയുടെ സംഭാഷണങ്ങള്‍ അടങ്ങിയ", "ഉണ്ണിയുടെ സംഭാഷണങ്ങള്‍ അടങ്ങിയ ","രമേശ്യുടെ സംഭാഷണങ്ങള്‍ അടങ്ങിയ"]

rePat = re.compile(u'[^ ]+?യുടെ(?= |$)',re.UNICODE)
for st in string:
    print rePat.findall(st)[0]

将输出

മാണിയുടെ
മന്ത്രിയുടെ
ഉണ്ണിയുടെ
രമേശ്യുടെ

re.search也可以为您完成工作

import re
string = ["മാണിയുടെ സംഭാഷണങ്ങള്‍ അടങ്ങിയ ","മന്ത്രിയുടെ സംഭാഷണങ്ങള്‍ അടങ്ങിയ", "ഉണ്ണിയുടെ സംഭാഷണങ്ങള്‍ അടങ്ങിയ ","രമേശ്യുടെ സംഭാഷണങ്ങള്‍ അടങ്ങിയ"]

rePat = re.compile(u'[^ ]+?യുടെ(?= |$)',re.UNICODE)
for st in string:
    print rePat.search(st).group()

给予

മാണിയുടെ
മന്ത്രിയുടെ
ഉണ്ണിയുടെ
രമേശ്യുടെ

答案 2 :(得分:0)

你非常误解正则表达式如何工作[]方括号声明要匹配的一组字符。当您在字符类的开头使用^时,它会声明一个负字符类,它匹配集合中的任何字符 not 。但是,它没有说明一系列字符。

我无法阅读您正在使用的脚本,但我发现您有两个不同的角色。我会调用第一个字符A和第二个字符B。由于您使用的是re.sub,因此您使用空字符串替换任何非AB的字符。这样您就不会在字符串中使用字符AB,这与您所说的相反。

使用str函数将字符串列表转换为单个字符串也没有任何意义。这基本上很漂亮打印您的列表,包括方括号。