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

Listing unicode words with same ending regular expression

我正在尝试使用正则表达式列出具有一种模式的所有 Unicode 单词。但它不是删除单词而是删除第一部分。 这是我的代码

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

预期的结果是

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

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

您正在匹配 യുടെ 以外的每个字符,并将该字符替换为空字符串。因此,当然 യുടെ 中的每个字符 次出现可能保留在结果字符串中!

模式 [^യുടെ] 表示 "any single character except those listed after the caret",在此上下文中表示 "not"。您在 Q 的主题中提到 "ending",但这与您实际使用的模式无关。

此外,当您将列表(容易混淆地命名为 string!-)转换为一行中的单个字符串时,为什么您期望输出多行,这让我感到困惑。一旦你获得了正确的模式,你最好将它应用到 for 循环或列表理解中的列表的每个项目。

您可以使用 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()

给予

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

你极大地误解了正则表达式的工作原理[]方括号声明一组要匹配的字符。当您在字符 class 的开头使用 ^ 时,它会声明一个否定字符 class,它匹配集合中的任何字符 not。但是,它没有说明字符序列。

我看不懂你正在使用的脚本,但我看到你有两个不同的角色。我将第一个字符称为 A,第二个字符称为 B。由于您使用的是 re.sub,因此您将用空字符串替换任何不是 AB 的字符。这使您在字符串中只剩下字符 AB,这与您所说的相反。

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