我正在寻找一种方法来获取字符串中a:之前的所有字母,但我不知道从哪里开始。我会使用正则表达式吗?如果是这样,怎么做?
string = "Username: How are you today?"
字符串有人能给我举个例子吗?
0sgqnhkj1#
只需使用split函数。它返回一个列表,因此您可以保留第一个元素:
split
>>> s1.split(':') ['Username', ' How are you today?'] >>> s1.split(':')[0] 'Username'
字符串
dba5bblo2#
使用index:
index
>>> string = "Username: How are you today?" >>> string[:string.index(":")] 'Username'
字符串索引会给予:在字符串中的位置,然后就可以对其进行切片了。如果要使用正则表达式:
:
>>> import re >>> re.match("(.*?):",string).group() 'Username'
型match从字符串的开头开始匹配。也可以使用itertools.takewhile
match
itertools.takewhile
>>> import itertools >>> "".join(itertools.takewhile(lambda x: x!=":", string)) 'Username'
型
z18hc3ub3#
您不需要regex来执行此操作
regex
>>> s = "Username: How are you today?"
字符串可以使用split方法在':'字符上拆分字符串
':'
>>> s.split(':') ['Username', ' How are you today?']
型并将元素[0]切出以获得字符串的第一部分。
[0]
>>> s.split(':')[0] 'Username'
9njqaruj4#
我已经在Python 3.9.13(Python Notebook)下对这些不同的技术进行了基准测试。
c
s
import string, random, re SYMBOLS = string.ascii_uppercase + string.digits SIZE = 10 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**20): print("\nString length:", string_length) test_set = list(create_test_set(string_length)) test_set_for_regex = [(re.compile(fr"(.*?){c}").match, s) for (c, s) in test_set] print(" regex (compiled):", end=" ") %timeit [re_match(s)[1] for (re_match, s) in test_set_for_regex] 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(fr"(.*?){c}", s)[1] for (c, s) in test_set]
String length: 16 partition: 1.86 µs split: 2.08 µs split (limited): 2.08 µs index: 2.37 µs regex (compiled): 3.52 µs regex: 8.77 µs String length: 256 partition: 1.92 µs index: 2.27 µs split (limited): 2.32 µs split: 5.37 µs regex (compiled): 7.59 µs regex: 12.90 µs String length: 65536 index: 2.20 µs regex (compiled): 7.15 µs regex: 12.10 µs partition: 25.70 µs split (limited): 25.90 µs split: 1110.00 µs String length: 1048576 index: 2.34 µs regex (compiled): 9.13 µs regex: 14.30 µs partition: 543.00 µs split (limited): 587.00 µs split: (interrupted before completion)
zu0ti5jz5#
partition()可能比split()更好,因为它在没有分隔符或更多分隔符的情况下具有更好的可预测结果。
ljsrvy3e6#
要使用RegEx解决这个问题,可以使用负先行/负滞后方法。例如,下面的Python代码:
import re string = "Username: How are you today?" regex='(\S*)[:]' data=re.findall(regex, string) print(data)
6条答案
按热度按时间0sgqnhkj1#
只需使用
split
函数。它返回一个列表,因此您可以保留第一个元素:字符串
dba5bblo2#
使用
index
:字符串
索引会给予
:
在字符串中的位置,然后就可以对其进行切片了。如果要使用正则表达式:
型
match
从字符串的开头开始匹配。也可以使用
itertools.takewhile
型
z18hc3ub3#
您不需要
regex
来执行此操作字符串
可以使用
split
方法在':'
字符上拆分字符串型
并将元素
[0]
切出以获得字符串的第一部分。型
9njqaruj4#
我已经在Python 3.9.13(Python Notebook)下对这些不同的技术进行了基准测试。
TLDR
c
在s
中时,我会对小字符串使用partition,对长字符串使用index。代码
字符串
结果(重新格式化和排序以提高可读性)
型
zu0ti5jz5#
partition()可能比split()更好,因为它在没有分隔符或更多分隔符的情况下具有更好的可预测结果。
ljsrvy3e6#
要使用RegEx解决这个问题,可以使用负先行/负滞后方法。
例如,下面的Python代码:
字符串