#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()