gpt4 book ai didi

python - 如何使用 Python Regex 提取特定字符串

转载 作者:行者123 更新时间:2023-12-01 10:29:02 25 4
gpt4 key购买 nike

我有一个非常具有挑战性的字符串,我一直在努力。
例如,

str1 = '95% for Pikachu, 92% for Sandshrew'
str2 = '70% for Paras & 100% Arcanine'
str3 = '99% Diglett, 40% Dugtrio'
str4 = '10% Squirtle, 100% for Alakazam'
str5 = '30% Metopod & 99% Dewgong'

字符串以% 整数开头,可能有for 或没有,然后是口袋妖怪的名字。可能有 comma(,)& 符号,然后是新的 % 整数。最后还有pokemon的另一个名字。(都是大写字母开头的)
我想提取两个pokemon,比如result,

['Pikachu', 'Sandshrew']
['Paras', 'Arcanine']
['Diglett', 'Dugtrio']
['Squirtle', 'Alakazam']
['Metopod', 'Dewgong']

我可以创建所有口袋妖怪的列表,然后使用 in 语法,但这不是最好的方法(以防他们添加更多口袋妖怪)。是否可以使用正则表达式提取?
提前致谢!
编辑
根据要求,我正在添加我的代码,

str_list = [str1, str2, str3, str4, str5]

for x in str_list:
temp_list = []
if 'for' in x:
temp = x.split('% for', 1)[1].strip()
temp_list.append(temp)
else:
temp = x.split(" ", 1)[1]
temp_list.append(temp)
print(temp_list)

我知道这不是正则表达式。我试过的表达式是,\d+ 到提取整数开始...但不知道如何开始。
EDIT2
@b_c 有很好的边缘情况,所以我在这里添加它

edge_str = '100% for Pikachu, 29% Pika Pika Pikachu'

结果

['Pikachu', 'Pika Pika Pikachu']

最佳答案

希望我没有过度设计这个,但我想涵盖稍微复杂的命名口袋妖怪的边缘情况,例如“Mime 先生”、“Farfetch'd”和/或“Nidoran♂” "(只看前 151 个)。

我使用的模式是 (?:(?:\d+%(?: |for)+([A-Z](?:[\w\.♀♂']|(?: (?= [A-Z])))+))+)[, &]*,它看起来在我的测试中起作用(这里是 regex101 link 用于分割)。

对于一般摘要,我正在寻找:

  • 1+ 位后跟 %
  • 空格或“for”一词至少出现一次
  • (开始捕获)起始大写字母
  • 至少其中之一(结束捕获组):
    • 单词字符、句点、男性/女性符号或撇号
      • 注意:如果您想捕获其他“怪异”的神奇宝贝字符,例如数字、冒号等,请将它们添加到此部分([\w\.♀♂'] 位) .
    • OR 空格,但后跟大写字母
  • 逗号、空格或和号,任意次数

除非更改,否则 Python 的内置 re 模块不支持重复捕获组(我相信我做对了),所以我只是使用 re.findall 并组织他们成对(我用复杂的名字替换了你输入的几个名字):

import re

str1 = '95% for Pikachu, 92% for Mr. Mime'
str2 = '70% for Paras & 100% Arcanine'
str3 = '99% Diglett, 40% Dugtrio'
str4 = "10% Squirtle, 100% for Farfetch'd"
str5 = '30% Metopod & 99% Nidoran♂'

pattern = r"(?:(?:\d+%(?: |for)+([A-Z](?:[\w\.♀♂']|(?: (?=[A-Z])))+))+)[, &]*"

# Find matches in each string, then unpack each list of
# matches into a flat list
all_matches = [match
for s in [str1, str2, str3, str4, str5]
for match in re.findall(pattern, s)]

# Pair up the matches
pairs = zip(all_matches[::2], all_matches[1::2])

for pair in pairs:
print(pair)

然后打印出来:

('Pikachu', 'Mr. Mime')
('Paras', 'Arcanine')
('Diglett', 'Dugtrio')
('Squirtle', "Farfetch'd")
('Metopod', 'Nidoran♂')

此外,正如已经提到的,您在 pokemon 名称中确实有一些拼写错误,但不幸的是,正则表达式不是解决该问题的正确方法:)

关于python - 如何使用 Python Regex 提取特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59667611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com