Я ищу способ получить все буквы в строке перед: но я не знаю, с чего начать. Могу ли я использовать регулярное выражение? Если да, то как?
string = "Username: How are you today?"
Может кто-нибудь показать мне пример того, что я могу сделать?
Просто воспользуйтесь split
функцией. Он возвращает список, поэтому вы можете оставить первый элемент:
>>> s1.split(':')
['Username', ' How are you today?']
>>> s1.split(':')[0]
'Username'
s1.partition(':')[0]
Использование
index
:>>> string = "Username: How are you today?" >>> string[:string.index(":")] 'Username'
Индекс даст вам позицию
:
в строке, после чего вы можете ее разрезать.Если вы хотите использовать регулярное выражение:
>>> import re >>> re.match("(.*?):",string).group() 'Username'
match
соответствует с начала строки.вы также можете использовать
itertools.takewhile
>>> import itertools >>> "".join(itertools.takewhile(lambda x: x!=":", string)) 'Username'
источник
Вам не нужно
regex
для этого>>> s = "Username: How are you today?"
Вы можете использовать этот
split
метод для разделения строки на':'
символ>>> s.split(':') ['Username', ' How are you today?']
И вырежьте элемент,
[0]
чтобы получить первую часть строки>>> s.split(':')[0] 'Username'
источник
Я протестировал эти различные методы в Python 3.7.0 (IPython).
TL; DR
c
известен символ разделения ): предварительно скомпилированное регулярное выражение.s.partition(c)[0]
.c
может не быть внутриs
): раздел, разделение.Код
import string, random, re SYMBOLS = string.ascii_uppercase + string.digits SIZE = 100 def create_test_set(string_length): for _ in range(SIZE): random_string = ''.join(random.choices(SYMBOLS, k=string_length)) yield (random.choice(random_string), random_string) for string_length in (2**4, 2**8, 2**16, 2**32): print("\nString length:", string_length) print(" regex (compiled):", end=" ") test_set_for_regex = ((re.compile("(.*?)" + c).match, s) for (c, s) in test_set) %timeit [re_match(s).group() for (re_match, s) in test_set_for_regex] test_set = list(create_test_set(16)) print(" partition: ", end=" ") %timeit [s.partition(c)[0] for (c, s) in test_set] print(" index: ", end=" ") %timeit [s[:s.index(c)] for (c, s) in test_set] print(" split (limited): ", end=" ") %timeit [s.split(c, 1)[0] for (c, s) in test_set] print(" split: ", end=" ") %timeit [s.split(c)[0] for (c, s) in test_set] print(" regex: ", end=" ") %timeit [re.match("(.*?)" + c, s).group() for (c, s) in test_set]
Полученные результаты
String length: 16 regex (compiled): 156 ns ± 4.41 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) partition: 19.3 µs ± 430 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) index: 26.1 µs ± 341 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) split (limited): 26.8 µs ± 1.26 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) split: 26.3 µs ± 835 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) regex: 128 µs ± 4.02 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) String length: 256 regex (compiled): 167 ns ± 2.7 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) partition: 20.9 µs ± 694 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) index: 28.6 µs ± 2.73 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) split (limited): 27.4 µs ± 979 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) split: 31.5 µs ± 4.86 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) regex: 148 µs ± 7.05 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) String length: 65536 regex (compiled): 173 ns ± 3.95 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) partition: 20.9 µs ± 613 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) index: 27.7 µs ± 515 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) split (limited): 27.2 µs ± 796 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) split: 26.5 µs ± 377 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) regex: 128 µs ± 1.5 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) String length: 4294967296 regex (compiled): 165 ns ± 1.2 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) partition: 19.9 µs ± 144 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) index: 27.7 µs ± 571 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) split (limited): 26.1 µs ± 472 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) split: 28.1 µs ± 1.69 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) regex: 137 µs ± 6.53 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
источник
s.index(c)
вызывает ValueError, когдаc
не находится внутриs
. Таким образом, я считаю безопасным, когда я уверен, что разделяемая строка содержит разделитель, в противном случае небезопасно.Для этой цели partition () может быть лучше, чем split (), поскольку он дает лучшие предсказуемые результаты в ситуациях, когда у вас нет разделителя или большего количества разделителей.
источник
partition
иsplit
будут работать прозрачно с пустой строкой или без разделителей. Стоит отметить, чтоword[:word.index(':')]
лопнет в обоих этих случаях.