2017-01-24 2 views
1

Это кажется очень очевидной ошибкой, которую я пытаюсь решить уже почти час. :(Как использовать регулярное выражение или заменить для очистки списка?

lst = ['\xa0\xa0+11-9188882266\xa0\xa0+01-9736475634 ','\xa0\xa0+11-9177772266\xa0\xa0+01-9736475234'] 

Я пытаюсь захватить цифры, дефис и знак + только. В основном удалить все \xa0.

Я думал, что Regex будет правильный путь идти о нем. Пробовал и не удалось:

mRegex = (['+0-9-']) 
lst = re.match(mRegex,lst) 

Traceback (most recent call last): File "", line 1, in File "C:\Python34\lib\re.py", line 160, in match return _compile(pattern, flags).match(string) File "C:\Python34\lib\re.py", line 282, in _compile p, loc = _cache[type(pattern), pattern, flags] TypeError: unhashable type: 'list'

Я дал ему еще несколько попыток с regex затем перешел на replace:

h.replace(r"\xa0","")

Он ничего к lst не делать. Остается точно такой же.

Когда я делаю len(lst[0]), я получаю 33, что очень странно.

В: с

for i in lst[0]: 
    print(i) 

выход не показывает \xa0.

Я полностью смущен здесь.

ответ

6

Во-первых, вы не можете применять замену/регулярное выражение в списке. Вы должны применять их для каждой строки и использовать понимание списка, чтобы перестроить очищенный список.

второй, при замене вы используете префикс в сырье, когда вы не должны использовать его, так как он относится к \x буквально, не то, что вы хотите.

Я хотел бы сделать:

lst = [x.replace("\xa0","") for x in lst] 

приводит:

['+11-9188882266+01-9736475634 ', '+11-9177772266+01-9736475234'] 

и BTW: mRegex = (['+0-9-']) не работает, потому что вы в основном определения списка 1 строки. Вы, вероятно, имел в виду mRegex = '([0-9\-+])'

Решение регулярное выражение будет:

lst = [re.sub(r"[^\d+\-]","",x) for x in lst] 

(удаляет символы, не соответствующие классу обугленного и \d это (примерно) эквивалентно 0-9)

+0

Спасибо. Это решение работает отлично. Тем не менее, в то же время я попытался: «h = lst [0]' 'h.split()' и по какой-то причине теперь я получаю только этот номер как два отдельных элемента списка. именно то, что я хотел, но было бы здорово, если бы объяснение этого возможно. – Sid

+1

Это потому, что '\ xa0' является своего рода пробелом (0x20 + 0x80 = 0xa0), используемым в консоли Windows. 'split' обнаруживает его и разбивает числа в соответствии с пробелом. –

+0

Спасибо. Еще многое предстоит узнать. – Sid

 Смежные вопросы

  • Нет связанных вопросов^_^