Không có chức năng chuỗi tích hợp đơn giản nào thực hiện những gì bạn đang tìm kiếm, nhưng bạn có thể sử dụng các biểu thức chính quy mạnh mẽ hơn:
import re
[m.start[] for m in re.finditer['test', 'test test test test']]
#[0, 5, 10, 15]
Nếu bạn muốn tìm thấy các trận đấu chồng chéo, Lookahead sẽ làm điều đó:
[m.start[] for m in re.finditer['[?=tt]', 'ttt']]
#[0, 1]
Nếu bạn muốn tìm kiếm đảo ngược tất cả không có sự chồng chéo, bạn có thể kết hợp nhìn tích cực và tiêu cực thành một biểu thức như thế này:
search = 'tt'
[m.start[] for m in re.finditer['[?=%s][?!.{1,%d}%s]' % [search, len[search]-1, search], 'ttt']]
#[1]
def find_all[a_str, sub]:
start = 0
while True:
start = a_str.find[sub, start]
if start == -1: return
yield start
start += len[sub] # use start += 1 to find overlapping matches
list[find_all['spam spam spam spam', 'spam']] # [0, 5, 10, 15]
5 trả về một trình tạo, vì vậy bạn có thể thay đổi def find_all[a_str, sub]:
start = 0
while True:
start = a_str.find[sub, start]
if start == -1: return
yield start
start += len[sub] # use start += 1 to find overlapping matches
list[find_all['spam spam spam spam', 'spam']] # [0, 5, 10, 15]
6 ở trên thành def find_all[a_str, sub]:
start = 0
while True:
start = a_str.find[sub, start]
if start == -1: return
yield start
start += len[sub] # use start += 1 to find overlapping matches
list[find_all['spam spam spam spam', 'spam']] # [0, 5, 10, 15]
7 để lấy một trình tạo thay vì một danh sách sẽ hiệu quả hơn nếu bạn chỉ lặp lại kết quả một lần.
Đã trả lời ngày 12 tháng 1 năm 2011 lúc 2:43Jan 12, 2011 at 2:43
Moinudinmoinudinmoinudin
129K45 Huy hiệu vàng188 Huy hiệu bạc213 Huy hiệu đồng45 gold badges188 silver badges213 bronze badges
9
>>> help[str.find]
Help on method_descriptor:
find[...]
S.find[sub [,start [,end]]] -> int
Vì vậy, chúng ta có thể tự xây dựng nó:
def find_all[a_str, sub]:
start = 0
while True:
start = a_str.find[sub, start]
if start == -1: return
yield start
start += len[sub] # use start += 1 to find overlapping matches
list[find_all['spam spam spam spam', 'spam']] # [0, 5, 10, 15]
Không có chuỗi tạm thời hoặc regexes cần thiết.
Đã trả lời ngày 12 tháng 1 năm 2011 lúc 3:13Jan 12, 2011 at 3:13
Karl Knechtelkarl KnechtelKarl Knechtel
59,2K9 Huy hiệu vàng86 Huy hiệu bạc130 Huy hiệu đồng9 gold badges86 silver badges130 bronze badges
6
Sử dụng
def find_all[a_str, sub]:
start = 0
while True:
start = a_str.find[sub, start]
if start == -1: return
yield start
start += len[sub] # use start += 1 to find overlapping matches
list[find_all['spam spam spam spam', 'spam']] # [0, 5, 10, 15]
5:import re
sentence = input["Give me a sentence "]
word = input["What word would you like to find "]
for match in re.finditer[word, sentence]:
print [match.start[], match.end[]]
Đối với
def find_all[a_str, sub]:
start = 0
while True:
start = a_str.find[sub, start]
if start == -1: return
yield start
start += len[sub] # use start += 1 to find overlapping matches
list[find_all['spam spam spam spam', 'spam']] # [0, 5, 10, 15]
9 và import re
sentence = input["Give me a sentence "]
word = input["What word would you like to find "]
for match in re.finditer[word, sentence]:
print [match.start[], match.end[]]
0, điều này sẽ mang lại đầu ra:[0, 4]
[19, 23]
[24, 28]
Đã trả lời ngày 3 tháng 2 năm 2016 lúc 19:01Feb 3, 2016 at 19:01
IdosidosIdos
14.8K14 Huy hiệu vàng56 Huy hiệu bạc71 Huy hiệu đồng14 gold badges56 silver badges71 bronze badges
2
Đây là một cách [rất không hiệu quả] để có được tất cả [tức là thậm chí chồng chéo] phù hợp:
>>> string = "test test test test"
>>> [i for i in range[len[string]] if string.startswith['test', i]]
[0, 5, 10, 15]
Đã trả lời ngày 12 tháng 1 năm 2011 lúc 2:48Jan 12, 2011 at 2:48
Thkalathkalathkala
81.8K23 Huy hiệu vàng152 Huy hiệu bạc198 Huy hiệu đồng23 gold badges152 silver badges198 bronze badges
3
Một lần nữa, chủ đề cũ, nhưng đây là giải pháp của tôi bằng cách sử dụng trình tạo và đơn giản
import re
sentence = input["Give me a sentence "]
word = input["What word would you like to find "]
for match in re.finditer[word, sentence]:
print [match.start[], match.end[]]
1.generator and plain import re
sentence = input["Give me a sentence "]
word = input["What word would you like to find "]
for match in re.finditer[word, sentence]:
print [match.start[], match.end[]]
1. def findall[p, s]:
'''Yields all the positions of
the pattern p in the string s.'''
i = s.find[p]
while i != -1:
yield i
i = s.find[p, i+1]
Thí dụ
x = 'banananassantana'
[[i, x[i:i+2]] for i in findall['na', x]]
trả lại
[m.start[] for m in re.finditer['[?=tt]', 'ttt']]
#[0, 1]
0Đã trả lời ngày 23 tháng 12 năm 2015 lúc 23:09Dec 23, 2015 at 23:09
AkirossakirossAkiRoss
11.1k6 Huy hiệu vàng58 Huy hiệu bạc84 Huy hiệu đồng6 gold badges58 silver badges84 bronze badges
3
Bạn có thể sử dụng
import re
sentence = input["Give me a sentence "]
word = input["What word would you like to find "]
for match in re.finditer[word, sentence]:
print [match.start[], match.end[]]
2 cho các trận đấu không chồng chéo.[m.start[] for m in re.finditer['[?=tt]', 'ttt']]
#[0, 1]
1Nhưng sẽ không làm việc cho:won't work for:
[m.start[] for m in re.finditer['[?=tt]', 'ttt']]
#[0, 1]
2
Anukul
5771 Huy hiệu vàng7 Huy hiệu bạc21 Huy hiệu đồng1 gold badge7 silver badges21 bronze badges
Đã trả lời ngày 12 tháng 1 năm 2011 lúc 2:55Jan 12, 2011 at 2:55
Chinmay Kanchichinmay KanchiChinmay Kanchi
60.2K22 Huy hiệu vàng86 Huy hiệu bạc113 Huy hiệu đồng22 gold badges86 silver badges113 bronze badges
2
Hãy đến, chúng ta hãy tái diễn cùng nhau.
[m.start[] for m in re.finditer['[?=tt]', 'ttt']]
#[0, 1]
3Không cần biểu hiện thường xuyên theo cách này.
Đã trả lời ngày 1 tháng 11 năm 2013 lúc 3:16Nov 1, 2013 at 3:16
Cody Piersallcody PiersallCody Piersall
8.0442 Huy hiệu vàng41 Huy hiệu bạc56 Huy hiệu Đồng2 gold badges41 silver badges56 bronze badges
2
Nếu bạn chỉ đang tìm kiếm một nhân vật duy nhất, điều này sẽ hoạt động:
[m.start[] for m in re.finditer['[?=tt]', 'ttt']]
#[0, 1]
4Also,
[m.start[] for m in re.finditer['[?=tt]', 'ttt']]
#[0, 1]
5Linh cảm của tôi là cả hai [đặc biệt là #2] đều không có hiệu suất khủng khiếp.
Đã trả lời ngày 24 tháng 9 năm 2014 lúc 21:12Sep 24, 2014 at 21:12
jstaabjstaabjstaab
3.05425 Huy hiệu bạc37 Huy hiệu đồng25 silver badges37 bronze badges
1
Đây là một chủ đề cũ nhưng tôi đã quan tâm và muốn chia sẻ giải pháp của mình.
[m.start[] for m in re.finditer['[?=tt]', 'ttt']]
#[0, 1]
6Nó sẽ trả lại một danh sách các vị trí nơi tìm thấy chuỗi con. Vui lòng bình luận nếu bạn thấy một lỗi hoặc phòng để cải tiến.
Đã trả lời ngày 1 tháng 4 năm 2015 lúc 9:23Apr 1, 2015 at 9:23
ThurinesthurinesThurines
Huy hiệu Bạc 1111 Huy hiệu Đồng1 silver badge3 bronze badges
Điều này thực hiện thủ thuật cho tôi khi sử dụng Re.Finditer
[m.start[] for m in re.finditer['[?=tt]', 'ttt']]
#[0, 1]
7Đã trả lời ngày 6 tháng 7 năm 2018 lúc 9:34Jul 6, 2018 at 9:34
Bruno vermeulenbruno vermeulenBruno Vermeulen
2.6872 Huy hiệu vàng15 Huy hiệu bạc24 Huy hiệu đồng2 gold badges15 silver badges24 bronze badges
Chủ đề này hơi cũ nhưng điều này làm việc cho tôi:
[m.start[] for m in re.finditer['[?=tt]', 'ttt']]
#[0, 1]
8
Wingerse
3.5681 Huy hiệu vàng26 Huy hiệu bạc54 Huy hiệu đồng1 gold badge26 silver badges54 bronze badges
Đã trả lời ngày 1 tháng 9 năm 2014 lúc 12:48Sep 1, 2014 at 12:48
Andrew đã thực hiện hAndrew H
46610 Huy hiệu bạc22 Huy hiệu Đồng10 silver badges22 bronze badges
Bạn co thể thử :
[m.start[] for m in re.finditer['[?=tt]', 'ttt']]
#[0, 1]
9Đã trả lời ngày 27 tháng 2 năm 2018 lúc 6:44Feb 27, 2018 at 6:44
Harsha Biyaniharsha BiyaniHarsha Biyani
6.8289 Huy hiệu vàng34 Huy hiệu bạc57 Huy hiệu Đồng9 gold badges34 silver badges57 bronze badges
Khi tìm kiếm một lượng lớn các từ khóa trong tài liệu, hãy sử dụng flashtext
search = 'tt'
[m.start[] for m in re.finditer['[?=%s][?!.{1,%d}%s]' % [search, len[search]-1, search], 'ttt']]
#[1]
0FlashText chạy nhanh hơn regex trên danh sách lớn các từ tìm kiếm.
Đã trả lời ngày 28 tháng 9 năm 2018 lúc 17:29Sep 28, 2018 at 17:29
Uri Gorenuri GorenUri Goren
12.8k6 Huy hiệu vàng55 Huy hiệu bạc104 Huy hiệu đồng6 gold badges55 silver badges104 bronze badges
Hàm này không nhìn vào tất cả các vị trí bên trong chuỗi, nó không lãng phí tài nguyên tính toán. Thử của tôi:
search = 'tt'
[m.start[] for m in re.finditer['[?=%s][?!.{1,%d}%s]' % [search, len[search]-1, search], 'ttt']]
#[1]
1Để sử dụng nó, hãy gọi nó như thế này:
search = 'tt'
[m.start[] for m in re.finditer['[?=%s][?!.{1,%d}%s]' % [search, len[search]-1, search], 'ttt']]
#[1]
2Đã trả lời ngày 13 tháng 1 năm 2020 lúc 12:39Jan 13, 2020 at 12:39
0
search = 'tt'
[m.start[] for m in re.finditer['[?=%s][?!.{1,%d}%s]' % [search, len[search]-1, search], 'ttt']]
#[1]
3Đã trả lời ngày 16 tháng 5 năm 2020 lúc 17:05May 16, 2020 at 17:05
Mascaimascaimascai
7195 Huy hiệu bạc20 Huy hiệu Đồng5 silver badges20 bronze badges
1
Bất kể các giải pháp nào được cung cấp bởi những người khác hoàn toàn dựa trên phương thức có sẵn [] hoặc bất kỳ phương thức có sẵn nào.
Thuật toán cơ bản cốt lõi để tìm thấy tất cả các lần xuất hiện của một chuỗi con trong một chuỗi là gì?
search = 'tt'
[m.start[] for m in re.finditer['[?=%s][?!.{1,%d}%s]' % [search, len[search]-1, search], 'ttt']]
#[1]
4Bạn cũng có thể kế thừa lớp str cho lớp mới và có thể sử dụng chức năng này bên dưới.
search = 'tt'
[m.start[] for m in re.finditer['[?=%s][?!.{1,%d}%s]' % [search, len[search]-1, search], 'ttt']]
#[1]
5Gọi phương thức
Báo chí.
Đã trả lời ngày 15 tháng 2 năm 2018 lúc 20:02Feb 15, 2018 at 20:02
Bạn co thể thử :
Đã trả lời ngày 27 tháng 2 năm 2018 lúc 6:44Harsha Biyaniharsha BiyaniOct 25, 2021 at 10:13
1
6.8289 Huy hiệu vàng34 Huy hiệu bạc57 Huy hiệu Đồng
search = 'tt'
[m.start[] for m in re.finditer['[?=%s][?!.{1,%d}%s]' % [search, len[search]-1, search], 'ttt']]
#[1]
7
Khi tìm kiếm một lượng lớn các từ khóa trong tài liệu, hãy sử dụng flashtext
FlashText chạy nhanh hơn regex trên danh sách lớn các từ tìm kiếm.16 gold badges59 silver badges81 bronze badges
Đã trả lời ngày 28 tháng 9 năm 2018 lúc 17:29Apr 10, 2018 at 19:40
2
Uri Gorenuri Goren
search = 'tt'
[m.start[] for m in re.finditer['[?=%s][?!.{1,%d}%s]' % [search, len[search]-1, search], 'ttt']]
#[1]
812.8k6 Huy hiệu vàng55 Huy hiệu bạc104 Huy hiệu đồng
search = 'tt'
[m.start[] for m in re.finditer['[?=%s][?!.{1,%d}%s]' % [search, len[search]-1, search], 'ttt']]
#[1]
9
Hàm này không nhìn vào tất cả các vị trí bên trong chuỗi, nó không lãng phí tài nguyên tính toán. Thử của tôi:Jan 20, 2020 at 22:47
Để sử dụng nó, hãy gọi nó như thế này:
>>> help[str.find]
Help on method_descriptor:
find[...]
S.find[sub [,start [,end]]] -> int
0Đã trả lời ngày 13 tháng 1 năm 2020 lúc 12:39Jun 10, 2021 at 16:46
Đã trả lời ngày 16 tháng 5 năm 2020 lúc 17:05
>>> help[str.find]
Help on method_descriptor:
find[...]
S.find[sub [,start [,end]]] -> int
1MascaimascaiNov 5, 2021 at 8:38
7195 Huy hiệu bạc20 Huy hiệu ĐồngWangSung
Bất kể các giải pháp nào được cung cấp bởi những người khác hoàn toàn dựa trên phương thức có sẵn [] hoặc bất kỳ phương thức có sẵn nào.1 silver badge5 bronze badges
Thuật toán cơ bản cốt lõi để tìm thấy tất cả các lần xuất hiện của một chuỗi con trong một chuỗi là gì?
>>> help[str.find]
Help on method_descriptor:
find[...]
S.find[sub [,start [,end]]] -> int
2Output:
>>> help[str.find]
Help on method_descriptor:
find[...]
S.find[sub [,start [,end]]] -> int
3Đã trả lời ngày 8 tháng 4 lúc 10:06Apr 8 at 10:06
MikemikeMike
Phù hiệu bằng đồng 9366 bronze badges
Vui lòng xem mã bên dưới
>>> help[str.find]
Help on method_descriptor:
find[...]
S.find[sub [,start [,end]]] -> int
4Đã trả lời ngày 16 tháng 3 năm 2017 lúc 1:14Mar 16, 2017 at 1:14
黄哥 python 培训 python 培训黄哥Python培训
2212 Huy hiệu bạc5 Huy hiệu Đồng2 silver badges5 bronze badges
1
>>> help[str.find]
Help on method_descriptor:
find[...]
S.find[sub [,start [,end]]] -> int
5Ví dụ :
>>> help[str.find]
Help on method_descriptor:
find[...]
S.find[sub [,start [,end]]] -> int
6returns:
>>> help[str.find]
Help on method_descriptor:
find[...]
S.find[sub [,start [,end]]] -> int
7
Đã trả lời ngày 8 tháng 11 năm 2020 lúc 13:49Nov 8, 2020 at 13:49
1
Không chính xác những gì OP yêu cầu nhưng bạn cũng có thể sử dụng chức năng chia để lấy danh sách tất cả các nền tảng không xảy ra. OP không chỉ định mục tiêu cuối cùng của mã nhưng nếu mục tiêu của bạn là loại bỏ các nền tảng dù sao thì đây có thể là một lớp lót đơn giản. Có lẽ có nhiều cách hiệu quả hơn để làm điều này với các chuỗi lớn hơn; Biểu thức thông thường sẽ được thích hợp hơn trong trường hợp đó
>>> help[str.find]
Help on method_descriptor:
find[...]
S.find[sub [,start [,end]]] -> int
8Đã làm một chút nhanh chóng các câu trả lời khác để xin lỗi nếu điều này đã ở đó.
Đã trả lời ngày 19 tháng 5 năm 2021 lúc 13:43May 19, 2021 at 13:43
als0052als0052als0052
3093 Huy hiệu bạc11 Huy hiệu đồng3 silver badges11 bronze badges
>>> help[str.find]
Help on method_descriptor:
find[...]
S.find[sub [,start [,end]]] -> int
9Đã trả lời ngày 2 tháng 6 năm 2021 lúc 3:24Jun 2, 2021 at 3:24
2
Tôi đã gặp phải vấn đề tương tự và đã làm điều này:
def find_all[a_str, sub]:
start = 0
while True:
start = a_str.find[sub, start]
if start == -1: return
yield start
start += len[sub] # use start += 1 to find overlapping matches
list[find_all['spam spam spam spam', 'spam']] # [0, 5, 10, 15]
0Tôi khá mới trong mã hóa để bạn có thể đơn giản hóa nó [và nếu được lên kế hoạch sử dụng liên tục tất nhiên làm cho nó trở thành một chức năng].
Tất cả và tất cả nó hoạt động như dự định cho những gì tôi đang làm.
EDIT: Vui lòng xem xét đây chỉ dành cho các ký tự đơn và nó sẽ thay đổi biến của bạn, vì vậy bạn phải tạo một bản sao của chuỗi trong một biến mới để lưu nó, tôi đã không đặt nó vào mã khiến nó dễ dàng và chỉ có Cho thấy cách tôi làm cho nó hoạt động.
Đã trả lời ngày 25 tháng 6 năm 2021 lúc 20:18Jun 25, 2021 at 20:18
Để tìm thấy tất cả sự xuất hiện của một ký tự trong một chuỗi cho và trả về dưới dạng từ điển, ví dụ: Hello Kết quả: {'H': 1, 'e': 1, 'l': 2, 'o': 1}{'h':1, 'e':1, 'l':2, 'o':1}
def find_all[a_str, sub]:
start = 0
while True:
start = a_str.find[sub, start]
if start == -1: return
yield start
start += len[sub] # use start += 1 to find overlapping matches
list[find_all['spam spam spam spam', 'spam']] # [0, 5, 10, 15]
1nếu không bạn làm như thế này
def find_all[a_str, sub]:
start = 0
while True:
start = a_str.find[sub, start]
if start == -1: return
yield start
start += len[sub] # use start += 1 to find overlapping matches
list[find_all['spam spam spam spam', 'spam']] # [0, 5, 10, 15]
2Đã trả lời ngày 30 tháng 4 lúc 8:00Apr 30 at 8:00
Hãy thử điều này nó đã làm việc cho tôi!
def find_all[a_str, sub]:
start = 0
while True:
start = a_str.find[sub, start]
if start == -1: return
yield start
start += len[sub] # use start += 1 to find overlapping matches
list[find_all['spam spam spam spam', 'spam']] # [0, 5, 10, 15]
3Đã trả lời ngày 9 tháng 6 lúc 13:17Jun 9 at 13:17
Tôi nghĩ rằng cách giải pháp sạch nhất là không có thư viện và sản lượng:without libraries and yields:
def find_all[a_str, sub]:
start = 0
while True:
start = a_str.find[sub, start]
if start == -1: return
yield start
start += len[sub] # use start += 1 to find overlapping matches
list[find_all['spam spam spam spam', 'spam']] # [0, 5, 10, 15]
4Lưu ý:
3 Phương thức Trả về import re
sentence = input["Give me a sentence "]
word = input["What word would you like to find "]
for match in re.finditer[word, sentence]:
print [match.start[], match.end[]]
4 khi không thể tìm thấy bất cứ điều gì import re
sentence = input["Give me a sentence "]
word = input["What word would you like to find "]
for match in re.finditer[word, sentence]:
print [match.start[], match.end[]]
import re
sentence = input["Give me a sentence "]
word = input["What word would you like to find "]
for match in re.finditer[word, sentence]:
print [match.start[], match.end[]]
3 method return import re
sentence = input["Give me a sentence "]
word = input["What word would you like to find "]
for match in re.finditer[word, sentence]:
print [match.start[], match.end[]]
4 when can't find anythingĐã trả lời ngày 13 tháng 10 lúc 20:06Oct 13 at 20:06