Как я могу удалить все строки, которые соответствуют определенному формату из списка? - PullRequest
0 голосов
/ 06 декабря 2018

Вопрос: Скажите, у меня есть список a = ['abd', ' the dog', '4:45 AM', '1234 total', 'etc...','6:31 PM', '2:36']

Как я могу удалить такие элементы, как 4:45 AM и 6:31 PM и '2:36'?то есть, как я могу удалить элементы формы number:number|number и элементы с AM / PM в конце?

Если честно, я не очень много пробовал, так как не уверен, с чего вообще начинать, другиечем-то вроде:

[x for x in a if x != something]

Ответы [ 7 ]

0 голосов
/ 20 января 2019

Попробуйте этот код на чистом Python.Во-первых, он проверяет последние два символа, если последние два символа равны 'am' или 'pm', элемент должен быть удален из списка.Во-вторых, он проверяет каждый элемент, если он содержит «:», если в элементе найдено «:», то проверяет символы до и после «:».Если символы до и после ':' являются цифрами, элемент удаляется из списка.Идея поддерживает число | число: число и число: число | число.

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 ...«]

0 голосов
/ 21 января 2019

Проверьте эту реализацию.

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...']
0 голосов
/ 17 января 2019

Рассмотрите возможность использования встроенной функции filter с скомпилированным регулярным выражением.

>>> 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...']

Лямбда также может использоваться для первого аргумента, если, например, вы хотеличтобы избежать компиляции регулярного выражения, хотя это и сложнее.

>>> filter(lambda s: not re.match(r'^\d\d?:\d\d(\s*[AP]M)?$', s), a)
['abd', ' the dog', '1234 total', 'etc...']

Обратите внимание, что в Python 3 filter возвращает итеративный объект вместо списка.


Регулярное выражениездесь работает, принимая все строки кроме \d\d?:\d\d(\s*[AP]M)?$.Это означает, что все строки, кроме тех, которые соответствуют HH:MM, могут произвольно заканчиваться пробелами, за которыми следуют AM или PM.

0 голосов
/ 16 января 2019

Вам не нужно регулярное выражение, попробуйте использовать:

>>> 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...']
>>> 
0 голосов
/ 06 декабря 2018

Регулярное выражение - простой ответ.

Вот альтернатива с чистым 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...']
0 голосов
/ 06 декабря 2018

Регулярное выражение \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 цифр на каждой стороне:.Я предлагаю вам поиграть с этим.Документация: здесь .

Подробно: $ указывает конец строки, а re.match начинает смотреть на начало строки.

0 голосов
/ 06 декабря 2018

Вы можете использовать регулярное выражение \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']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...