regex 如何在字符串Python中获取a:之前的所有内容

dly7yett  于 7个月前  发布在  Python
关注(0)|答案(6)|浏览(75)

我正在寻找一种方法来获取字符串中a:之前的所有字母,但我不知道从哪里开始。我会使用正则表达式吗?如果是这样,怎么做?

string = "Username: How are you today?"

字符串
有人能给我举个例子吗?

0sgqnhkj

0sgqnhkj1#

只需使用split函数。它返回一个列表,因此您可以保留第一个元素:

>>> s1.split(':')
['Username', ' How are you today?']
>>> s1.split(':')[0]
'Username'

字符串

dba5bblo

dba5bblo2#

使用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'

z18hc3ub

z18hc3ub3#

您不需要regex来执行此操作

>>> s = "Username: How are you today?"

字符串
可以使用split方法在':'字符上拆分字符串

>>> s.split(':')
['Username', ' How are you today?']


并将元素[0]切出以获得字符串的第一部分。

>>> s.split(':')[0]
'Username'

9njqaruj

9njqaruj4#

我已经在Python 3.9.13(Python Notebook)下对这些不同的技术进行了基准测试。

TLDR

  • 当我知道cs中时,我会对小字符串使用partition,对长字符串使用index
  • 否则为partition

代码

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)

zu0ti5jz

zu0ti5jz5#

partition()可能比split()更好,因为它在没有分隔符或更多分隔符的情况下具有更好的可预测结果。

ljsrvy3e

ljsrvy3e6#

要使用RegEx解决这个问题,可以使用负先行/负滞后方法。
例如,下面的Python代码:

import re
string = "Username: How are you today?"
regex='(\S*)[:]'

data=re.findall(regex, string)
print(data)

字符串

相关问题