2016-01-17 13 views
6

Tôi có một chuỗi - Python:Python - cách thanh lịch nhất để trích xuất một chuỗi con, được đưa ra trái và biên giới đúng

string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/" 

sản lượng dự kiến ​​là:

"Atlantis-GPS-coordinates" 

Tôi biết rằng sản lượng dự kiến được bao quanh bởi "/ bar /" ở bên trái và "/" ở bên phải:

"/bar/Atlantis-GPS-coordinates/" 

Giải pháp đề xuất sẽ như sau:

a = string.find("/bar/") 
b = string.find("/",a+5) 
output=string[a+5,b] 

Tác phẩm này, nhưng tôi không thích. Có ai đó biết một chức năng hay mẹo hay không?

+0

'string.split ("/bar/") [1] .split ("/") [0]' – dawg

Trả lời

7

Bạn có thể sử dụng split:

>>> string.split("/bar/")[1].split("/")[0] 
'Atlantis-GPS-coordinates' 

Một số hiệu quả từ việc thêm một phân chia tối đa của 1 Tôi cho rằng:

>>> string.split("/bar/", 1)[1].split("/", 1)[0] 
'Atlantis-GPS-coordinates' 

Hoặc sử dụng partition:

>>> string.partition("/bar/")[2].partition("/")[0] 
'Atlantis-GPS-coordinates' 

Hoặc một regex:

>>> re.search(r'/bar/([^/]+)', string).group(1) 
'Atlantis-GPS-coordinates' 

Phụ thuộc vào những gì nói với bạn và dữ liệu của bạn.

+0

Yêu câu trả lời của bạn. Tôi sẽ xác nhận nó. Ưu điểm/nhược điểm của phân chia và phân vùng là gì? – Vincent

+0

Sự khác biệt chính là cách mỗi xử lý sự chia tách nếu '/ bar /' không có mặt. 'phân vùng' luôn tạo ra một bộ ba phần tử với các chuỗi rỗng của phần tử phân vùng không được tìm thấy. 'split' thay đổi số phần tử trong danh sách được tạo ra. Nó dễ dàng hơn để kiểm tra xem 'phân vùng' đã làm những gì nó được cho là phải làm.Tôi sẽ sử dụng 'split' nếu tôi biết chuỗi sẽ chia thành công; 'partition' hoặc regex nếu tôi cần kiểm tra. – dawg

3

Những gì bạn không phải là tất cả những điều xấu. Tôi muốn viết nó là:

start = string.find('/bar/') + 5 
end = string.find('/', start) 
output = string[start:end] 

miễn là bạn biết rằng /bar/WHAT-YOU-WANT/ luôn luôn có mặt. Nếu không, tôi sẽ tiếp cận với các regular expression knife:

>>> import re 
>>> PATTERN = re.compile('^.*/bar/([^/]*)/.*$') 
>>> s = '/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/' 
>>> match = PATTERN.match(s) 
>>> match.group(1) 
'Atlantis-GPS-coordinates' 
+0

Nhóm regex của bạn thiếu dấu ngoặc đơn đóng –

+0

@MartinKonecny ​​thực sự. cám ơn –

0

Sử dụng re (chậm hơn so với các giải pháp khác):

>>> import re 
>>> string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/" 
>>> re.search(r'(?<=/bar/)[^/]+(?=/)', string).group() 
'Atlantis-GPS-coordinates' 
1
import re 

pattern = '(?<=/bar/).+?/' 
string = "/foo13546897/bar/Atlantis-GPS-coordinates/bar457822368/foo/" 

result = re.search(pattern, string) 
print string[result.start():result.end() - 1] 
# "Atlantis-GPS-coordinates" 

Đó là một ví dụ Python 2.x. Những gì nó làm đầu tiên là: 1. (? < =/bar /) có nghĩa là chỉ xử lý regex sau nếu điều này đứng trước nó (để/bar/phải trước nó) 2. '. +? /' Có nghĩa là bất kỳ số tiền của các ký tự cho đến khi '/' char tiếp theo

Hy vọng rằng sẽ giúp một số.

Nếu bạn cần thực hiện loại tìm kiếm này, tốt hơn hết là 'biên dịch' tìm kiếm này để thực hiện, nhưng nếu bạn chỉ cần làm điều đó một lần không bận tâm.

Các vấn đề liên quan