слева выделите что — нибудь перед вторым номером в строке

#python

Вопрос:

 a = "some rubish 2 some more rubish 2403 some street address, TX 4377435"
 

Это какая-то адресная строка с дополнительной информацией, которую я хочу удалить перед номером улицы, который всегда является 2-м номером справа. Я хочу, чтобы результат был таким

 "2403 some street address, TX 4377435"
 

До сих пор я мог бы придумать это

 special_char = '!@#$%^amp;*()-_= ,./\;:<>?{}[]|    '
ascii_letters  = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
a = "some rubish 2 some more rubish 2403 some street address, TX 77630409"
a.lstrip(ascii_letters special_char)
 

Что дает результат

 2 some more rubish 2403 some street address, TX 77630409
 

Комментарии:

1. всегда ли первое число состоит из 1 цифры? (всегда ли адрес больше 1 цифры)

2. Да, в выводе первым делом должно быть число. Там будет минимум 2 номера

3. Так что вы могли бы просто использовать регулярное выражение типа dd .* ?

4. @Sayse нет, числа могут быть любого размера

Ответ №1:

Вот вариант разделения регулярных выражений. Мы можем разделить входную строку на любое пространство, за которым следует цифра (используя указатель, чтобы избежать использования этой цифры). Затем отрежьте первые два элемента и сохраните остальные. Наконец, соединитесь обратно в одну строку, снова введя пробел.

 a = "some rubish 2 some more rubish 2403 some street address, TX 4377435"
parts = re.split(r'[ ](?=d)', a)
print(' '.join(parts[2:]))  # 2403 some street address, TX 4377435
 

Комментарии:

1. Ваш ответ очень умен, но вы можете улучшить его с maxsplit помощью аргументов parts = re.split(r'[ ](?=d)', a, 2) , чтобы вы могли использовать parts[-1] и не нуждались в обратном соединении строк. Кроме того, он не будет выдавать исключение в случае, если выражение не совпадает.

Ответ №2:

Вы можете найти индекс второго числа справа, используя re и [-2] индекс, и разрезать строку по нему

 a = "some rubish 2 some more rubish 2403 some street address, TX 4377435"
index = re.findall(r"d ", a)[-2]
print(a[a.index(index):]) # 2403 some street address, TX 77630409
 

Комментарии:

1.Немного лучше использовать finditer() , чтобы не позволять программе искать каждое вхождение числа, но останавливаться на втором совпадении (если оно существует). Его легко наносить Match.start() itertools.islice() [m.start() for m in islice(re.finditer(r"d ", a), 2)] . Тогда просто используйте a[matches[-1] if len(matches) == 2 else None:]

Ответ №3:

 import re    

re.search("dd .*","some rubish 2 some more rubish 2403 some street address, TX 77630409 asdsad").group()