我试图列出使用正则表达式获得一个模式的所有Unicode单词。但它并没有贬低这些词语,而是删除了第一部分。 这是我的代码
import re
string = ["മാണിയുടെ സംഭാഷണങ്ങള് അടങ്ങിയ ","മന്ത്രിയുടെ സംഭാഷണങ്ങള് അടങ്ങിയ", "ഉണ്ണിയുടെ സംഭാഷണങ്ങള് അടങ്ങിയ ","രമേശ്യുടെ സംഭാഷണങ്ങള് അടങ്ങിയ"]
print(type(string))
rePat = re.compile(u'[^യുടെ]',re.UNICODE)
print (rePat.sub("", str(string)))
预期结果是
മാണിയുടെ
മന്ത്രിയുടെ
ഉണ്ണിയുടെ
但是
我得到യുടെ
三次
这里的逻辑错误是什么?
答案 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
,因此您使用空字符串替换任何非A
或B
的字符。这样您就不会在字符串中使用字符A
和B
,这与您所说的相反。
使用str
函数将字符串列表转换为单个字符串也没有任何意义。这基本上很漂亮打印您的列表,包括方括号。