1

我目前正在使用 python 3.5。

我正在尝试制作一个接受输入的工具,并对所说的“玩家名”进行正则表达式搜索并返回匹配结果。我遇到了一个有趣的问题,因为这是与电子游戏相关的,并且一些用户的名字中有特殊字符(氏族标签)。

为了尝试清理输入,我正在使用re.escape,但我没有得到我期望的行为。

例如,我允许用户输入部分匹配项,并使用正则表达式来查找玩家。所以如果我输入Mall,它应该能够正则表达式找到Mallachar,她是我当前的示例匹配设置。

regex_match = r".*" + player_name + r".*"

if re.match(regex_match, str(name_list), re.IGNORECASE):
    player_list.append(players)

因为这是一个用户名不是唯一的系统,玩家可以更改他们的名字,所以我正在搜索用户的“列表”。

无论如何,我遇到的问题是人们有空间或氏族标签。例如,如果氏族~DOG~加入服务器,并且我有名字的人,~DOG~ Master并且~DOG- Runner如果我输入字符串~DOG~ Run,我会得到所有匹配项~DOG~ .*

我的理解是re.escape应该逃避空间,所以它是我搜索的一部分,所以它应该试图匹配这个

.*~DOG~\sRun.*

但相反,它似乎正在运行它,就像它忽略了之后的所有内容~DOG~

.*~DOG~.*

我误解了怎么回事re.escape

4

2 回答 2

0

使用in可能是解决此问题的正确方法,但使用正则表达式问题本身。

添加一组括号将让您使用匹配项

python so_post.py
('~DOG~ Run',)
alexl@MBP000413 ~ :)% cat so_post.py
import re
regex_match = r".*(~DOG~ Run).*"
name = "~DOG~ Run"

match =  re.match(regex_match, name, re.IGNORECASE)
print(match.groups())

使用命名组可以让您使用特定名称,而不仅仅是一般的匹配元组。

regex_match = r".*(?P<user_clan>~DOG~ Run).*"
name = "~DOG~ Run"

match =  re.match(regex_match, name, re.IGNORECASE)
print(match.groups("user_clan"))
于 2019-07-17T19:02:25.537 回答
0

您可以使用in运算符来检查是否player_name在其他字符串中:

name_list = ['~DOG~ Master', '~DOG~ Runner']
player_name = '~DOG~ Run'

player_list = []
for name in name_list:
    if player_name in name:
        player_list.append(name)

print(player_list)

这打印:

['~DOG~ Runner']
于 2019-07-17T18:51:06.560 回答