简体   繁体   中英

Removing element from a list by a regexp in Python

I am trying to remove a string that is in parentheses from a list in Python without success.

See following code:

full = ['webb', 'ellis', '(sportswear)']
regex = re.compile(r'\b\(.*\)\b')
filtered = [i for i in full if not regex.search(i)]

Returns:

['webb', 'ellis', '(sportswear)']

Could somebody point out my mistake?

The \\b word boundary makes it impossible to match ( at the beginning of a string since there is no word there (ie \\b requires a letter, digit or underscore to be right before ( in your pattern, and that is not the case).

As you confirm you need to match values that are fully enclosed with (...) , you need regex = re.compile(r'\\(.*\\)$') with re.match .

Use

import re
full = ['webb', 'ellis', '(sportswear)']
regex = re.compile(r'\(.*\)$')
filtered = [i for i in full if not regex.match(i)]
print(filtered)

See the IDEONE demo

The re.match will anchor the match at the start of the string, and the $ will anchor the match at the end of the string.

Note that if your string has newlines in it, use flags=re.DOTALL when compiling the regex (so that . could also match newline symbols, too).

>>> import re
>>> full = ['webb', 'ellis', '(sportswear)']
>>> x = filter(None, [re.sub(r".*\(.*\).*", r"", i) for i in full])
>>> x
['webb', 'ellis']

For my use case, this worked. Maybe it would be useful for someone finding the same problem

doc_list = dir(obj)
regex = re.compile(r'^__\w*__$')
filtered = [ele for ele in doc_list if not regex.match(ele)]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM