Python 从列表中的每个元素中检索特定的子字符串

Python 从列表中的每个元素中检索特定的子字符串,python,string,list,substring,list-comprehension,Python,String,List,Substring,List Comprehension,几个小时后,我就陷入了这样的困境: 我有一个名为size\u col的系列,包含887个元素,我想从大小中检索:S、M、L、XL。我尝试了两种不同的方法,列表理解和简单的if-elif循环,但两种方法都不起作用 sizes = ['S', 'M', 'L', 'XL'] tshirt_sizes = [] [tshirt_sizes.append(i) for i in size_col if i in sizes] 第二次尝试: sizes = [] for i in size_col:

几个小时后,我就陷入了这样的困境: 我有一个名为
size\u col
的系列,包含887个元素,我想从大小中检索:
S、M、L、XL
。我尝试了两种不同的方法,列表理解和简单的
if-elif
循环,但两种方法都不起作用

sizes = ['S', 'M', 'L', 'XL']

tshirt_sizes = []
[tshirt_sizes.append(i) for i in size_col if i in sizes]
第二次尝试:

sizes = []
for i in size_col:
if len(i) < 15:
   sizes.append(i.split(" / ",1)[-1])
else:
   sizes.append(i.split(" - ",1)[-1])

你可以这样做:

available_sizes = ["S", "M", "L", "XL"]
sizes = []

for i in size_col:
    for w in i.split():
        if w in available_sizes:
            sizes.append(w)
如果文本多次包含可用大小的单词,例如
t-Shirt Donna“La SèLa piùbella consonate”-M
,这将不起作用,因为它会将S和M添加到列表中


最初的答案是,在OP之前指定大小并不总是最后一个字

差不多。把字符串拆分成单词,然后取最后一个

sizes = []
for i in size_col:
    sizes.append(i.split()[-1])

你可以这样做:

available_sizes = ["S", "M", "L", "XL"]
sizes = []

for i in size_col:
    for w in i.split():
        if w in available_sizes:
            sizes.append(w)
如果文本多次包含可用大小的单词,例如
t-Shirt Donna“La SèLa piùbella consonate”-M
,这将不起作用,因为它会将S和M添加到列表中


最初的答案是,在OP之前指定大小并不总是最后一个字

差不多。把字符串拆分成单词,然后取最后一个

sizes = []
for i in size_col:
    sizes.append(i.split()[-1])
你需要在这里。预编译正则表达式模式,然后使用
模式。在列表中搜索

sizes = ['S', 'M', 'L', 'XL']
p = re.compile(r'\b({})\b'.format('|'.join(sizes))) 

tshirt_sizes = [p.search(i).group(0) for i in size_col]

为了增加安全性,您可能需要一个循环-列表理解不适合错误处理:

tshirt_sizes = []
for i in size_col:
    try:
        tshirt_sizes.append(p.search(i).group(0))
    except AttributeError:
        tshirt_sizes.append(None)
实际上,在这里使用正则表达式的唯一原因是适当地处理数据中的最后一行。一般来说,如果可以的话,您应该更喜欢使用字符串操作(即,
str.split
),除非可以避免,否则它们比基于正则表达式的模式匹配和提取要快得多,可读性也更好。预编译正则表达式模式,然后使用
模式。在列表中搜索

sizes = ['S', 'M', 'L', 'XL']
p = re.compile(r'\b({})\b'.format('|'.join(sizes))) 

tshirt_sizes = [p.search(i).group(0) for i in size_col]

为了增加安全性,您可能需要一个循环-列表理解不适合错误处理:

tshirt_sizes = []
for i in size_col:
    try:
        tshirt_sizes.append(p.search(i).group(0))
    except AttributeError:
        tshirt_sizes.append(None)

实际上,在这里使用正则表达式的唯一原因是适当地处理数据中的最后一行。一般来说,如果可以,您应该更喜欢使用字符串操作(即,
str.split
),除非可以避免,否则它们比基于正则表达式的模式匹配和提取要快得多,可读性也更高。

这个问题有两个方面,1)在元素上循环的最佳方法和2)分割字符串的正确方法

在一般情况下,列表理解可能是解决这类问题的正确方法,但您已经正确识别了正确拆分字符串的方法,这是一个棘手的问题

对于这类问题,您可以使用以下方法(与前面的答案相比,可能会使问题复杂化):

import re
pattern = re.compile(r'[-/] (A-Z)$') # select any uppercase letters after either - or / and a space and before the end of the line (marked by $)

sizes = [pattern.search(item).group(1) for item in size_col] # group 1 selects the set of characters in the first set of parentheses (the letters)

编辑:刚刚看到对帖子的编辑,指出条目并不总是在末尾,COLDSPEED的答案与此重复…

这个问题有两个方面,1)循环元素的最佳方法和2)分割字符串的正确方法

在一般情况下,列表理解可能是解决这类问题的正确方法,但您已经正确识别了正确拆分字符串的方法,这是一个棘手的问题

对于这类问题,您可以使用以下方法(与前面的答案相比,可能会使问题复杂化):

import re
pattern = re.compile(r'[-/] (A-Z)$') # select any uppercase letters after either - or / and a space and before the end of the line (marked by $)

sizes = [pattern.search(item).group(1) for item in size_col] # group 1 selects the set of characters in the first set of parentheses (the letters)

编辑:刚刚看到对文章的编辑,说明该项目并不总是在最后,COLDSPEED的答案与此重复…

如果您发布示例,请仅发布文本。我不知道你的情况,但我无法在不运行tesseract的情况下复制图片中的粘贴文本,这太费事了。@coldspeed已编辑,对不起。如果你正在发布示例,请仅发布文本。我不知道你的情况,但我无法在不运行tesseract的情况下复制图片中的粘贴文本,这太麻烦了。@coldspeed已编辑,抱歉。抱歉,刚刚看到对文件的编辑。显然,尺寸并不总是决定性的。很快就要编辑了。这不起作用,在某些情况下,大小不是最后一个元素,而且这对“XL”不起作用。这对XL有效,因为它需要最后一个字。但是如果尺寸不是最后一个字,那就不行了。我更新了答案。新的实现相当于已接受的实现,但在我的机器上速度稍快:14.6µs±214 ns,而根据magic命令%timeit的说法,是22.7µs±1.09µs。抱歉,刚才看到了对文件的编辑。显然,尺寸并不总是决定性的。很快就要编辑了。这不起作用,在某些情况下,大小不是最后一个元素,而且这对“XL”不起作用。这对XL有效,因为它需要最后一个字。但是如果尺寸不是最后一个字,那就不行了。我更新了答案。新的实现相当于已接受的实现,但在我的机器上速度稍快:14.6µs±214 ns,而根据magic命令%timeit的说法是22.7µs±1.09µs。