ฉันกำลังมองหาวิธีรับตัวอักษรทั้งหมดในสตริงก่อน a: แต่ฉันไม่รู้ว่าจะเริ่มจากตรงไหน ฉันจะใช้ regex หรือไม่ ถ้าเป็นอย่างไร
string = "Username: How are you today?"
ใครช่วยแสดงตัวอย่างสิ่งที่ฉันทำได้
ฉันกำลังมองหาวิธีรับตัวอักษรทั้งหมดในสตริงก่อน a: แต่ฉันไม่รู้ว่าจะเริ่มจากตรงไหน ฉันจะใช้ regex หรือไม่ ถ้าเป็นอย่างไร
string = "Username: How are you today?"
ใครช่วยแสดงตัวอย่างสิ่งที่ฉันทำได้
คำตอบ:
เพียงแค่ใช้split
ฟังก์ชัน จะส่งคืนรายการดังนั้นคุณสามารถเก็บองค์ประกอบแรกไว้ได้:
>>> s1.split(':')
['Username', ' How are you today?']
>>> s1.split(':')[0]
'Username'
ใช้index
:
>>> string = "Username: How are you today?"
>>> string[:string.index(":")]
'Username'
ดัชนีจะให้ตำแหน่งของ:
สตริงจากนั้นคุณสามารถแบ่งได้
หากคุณต้องการใช้ regex:
>>> 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)
c
รู้จักสัญลักษณ์แยก): regex ที่คอมไพล์ไว้ล่วงหน้า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
จะทำงานอย่างโปร่งใสกับสตริงว่างหรือไม่มีตัวคั่น เป็นที่น่าสังเกตว่าword[:word.index(':')]
จะเกิดขึ้นในทั้งสองกรณีนี้
s1.partition(':')[0]