如何从列表中删除所有适合某些格式的字符串?

时间:2018-12-06 20:33:36

标签: python python-2.7 formatting

问题: 假设我有一个列表public boolean cigarParty(int cigars, boolean isWeekend) { if (cigars>=40 || cigars <= 60 && isWeekend){ return true; }else if(cigars<40){ return false; } else { return false; } }

如何删除a = ['abd', ' the dog', '4:45 AM', '1234 total', 'etc...','6:31 PM', '2:36']4:45 AM和'2:36'之类的元素?即如何删除6:31 PM形式的元素以及结尾为AM / PM的元素?

说实话,除了以下内容外,我还没有做太多尝试,因为我不确定从哪开始?

number:number|number

7 个答案:

答案 0 :(得分:11)

您可以使用正则表达式\d+(?::\d+)?$并使用它进行过滤。

请参阅演示。

https://regex101.com/r/HoGZYh/1

import re
a = ['abd', ' the dog', '4:45', '1234 total', '123', '6:31']
print [i for i in a if not re.match(r"\d+(?::\d+)?$", i)]

输出:['abd', ' the dog', '1234 total']

答案 1 :(得分:2)

考虑将内置的filter函数与已编译的正则表达式一起使用。

#!/usr/bin/env python3

import codecs
import io

stream = io.BytesIO(b'abc')
#reader = codecs.getreader('utf-8')(stream)
reader = io.TextIOWrapper(stream)
print(reader, reader.read())

例如,如果您想避免编译正则表达式,尽管它比较麻烦,也可以将lambda用作第一个参数。

>>> import re
>>> no_times = re.compile(r'^(?!\d\d?:\d\d(\s*[AP]M)?$).*$')
>>> a = ['abd', ' the dog', '4:45 AM', '1234 total', 'etc...','6:31 PM', '2:36']

>>> filter(no_times.match, a)
['abd', ' the dog', '1234 total', 'etc...']

请注意,在Python 3中,>>> filter(lambda s: not re.match(r'^\d\d?:\d\d(\s*[AP]M)?$', s), a) ['abd', ' the dog', '1234 total', 'etc...'] 返回一个可迭代的对象而不是列表。


这里的正则表达式通过接受除 filter以外的所有字符串来工作。这意味着除与\d\d?:\d\d(\s*[AP]M)?$匹配的字符串以外的所有字符串,可以选择在某些空格后跟AM或PM。

答案 2 :(得分:2)

在纯Python中尝试此代码。 首先,它检查最后两个字符,如果最后两个字符等于'am'或'pm',则应从列表中删除元素。 其次,它检查每个元素是否包含“:”,如果在元素中找到“:”,则检查“:”之前和之后的字符。如果“:”前后的字符是数字,则该元素将从列表中删除。这个想法支持number | number:number和number:number | number。

def removeElements(a):
    removed_elements = []
    L = len(a)
    for i in range(L):
        element = a[i]
        if 'am' == element[-2:].lower() or 'pm' ==element[-2:].lower() :
            removed_elements.append(element)
        if ':' in element:
            part1 = element.split(':')
            part2 = element.split(':')
            if part1[-1].isdigit() and part2[0].isdigit():
                removed_elements.append(element)
    output =  []
    for element in a:
        if not(element in removed_elements):
            output.append(element)
    return output

a = ['abd', ' the dog', '4:45 AM', '1234 total', 'etc...','6:31 PM', '2:36']
output = removeElements(a)
print output

此示例的

输出为: ['abd','the dog','1234 total','etc ...']

答案 3 :(得分:1)

正则表达式\d:\d\d$匹配一个数字,然后匹配一个:,后跟两个数字。

>>> import re
>>> a = ['abd', ' the dog', '4:45', '1234 total', 'etc...', '6:31']
>>> regex = re.compile('\d:\d\d$')
>>> [s for s in a if regex.match(s)]
['4:45', '6:31']
>>> [s for s in a if not regex.match(s)]
['abd', ' the dog', '1234 total', 'etc...']

\d+:\d+$将与n >= 1的每一侧的任意数量的:位数字匹配。我建议你玩一玩。该文档为here

详细信息:$指定字符串的结尾,re.match开始查看字符串的开头。

答案 4 :(得分:1)

正则表达式是简单的答案。

这是纯Python的替代方法:

>>> a = ['abd', ' the dog', '4:45', '1234 total', 'etc...','6:31', '1234']
>>> [s for s in a if not all(e.isdigit() for e in s.split(':'))]
['abd', ' the dog', '1234 total', 'etc...']

请注意,'1234'.split(':')有一个副作用,也可以过滤所有数字。


如果有'1:2:3'类型数字的可能性:

>>> a = ['abd', ' the dog', '4:45', '1234 total', 'etc...','6:31', '1234', '1:2:3']
>>> [s for s in a if len(s.split(':'))<=2 and not all(e.isdigit() for e in s.split(':'))]
['abd', ' the dog', '1234 total', 'etc...']

答案 5 :(得分:1)

您不需要正则表达式,请尝试使用:

>>> a = ['abd', ' the dog', '4:45 AM', '1234 total', 'etc...','6:31 PM', '2:36']
>>> [i for i in a if ':' not in i and not i[-2:] in ['AM','PM']]
['abd', ' the dog', '1234 total', 'etc...']
>>> 

或者使用正则表达式使用更简单的解决方案:

>>> import re
>>> a = ['abd', ' the dog', '4:45 AM', '1234 total', 'etc...','6:31 PM', '2:36']
>>> [i for i in a if not re.search('\d+:\d+',i)]
['abd', ' the dog', '1234 total', 'etc...']
>>> 

或者更容易的非正则表达式版本:

>>> a = ['abd', ' the dog', '4:45 AM', '1234 total', 'etc...','6:31 PM', '2:36']
>>> [i for i in a if ':' not in i]
['abd', ' the dog', '1234 total', 'etc...']
>>> 

答案 6 :(得分:1)

检查此实现。

import re

a = ['abd', ' the dog', '4:45 AM', '1234 total', 'etc...','6:31 PM', '2:36']
regex = re.compile(r'^[0-2]{0,1}[0-9]\:[0-5][0-9]\s{0,1}([AP][M]){0,1}')

a  = [x for x in a if not regex.match(x)]
print(a)

输出

['abd', ' the dog', '1234 total', 'etc...']