列出具有相同结尾正则表达式的 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
,因此您将用空字符串替换任何不是 A
或 B
的字符。这使您在字符串中只剩下字符 A
和 B
,这与您所说的相反。
使用 str
函数将字符串列表转换为单个字符串也没有任何意义。这基本上可以很好地打印您的列表,包括方括号。
我正在尝试使用正则表达式列出具有一种模式的所有 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
,因此您将用空字符串替换任何不是 A
或 B
的字符。这使您在字符串中只剩下字符 A
和 B
,这与您所说的相反。
使用 str
函数将字符串列表转换为单个字符串也没有任何意义。这基本上可以很好地打印您的列表,包括方括号。