Chia chuỗi dựa trên biểu thức chính quy


143

Tôi có đầu ra của một lệnh ở dạng bảng. Tôi đang phân tích cú pháp đầu ra này từ một tệp kết quả và lưu trữ nó trong một chuỗi. Mỗi phần tử trong một hàng được phân tách bằng một hoặc nhiều ký tự khoảng trắng, do đó tôi đang sử dụng các biểu thức chính quy để khớp 1 hoặc nhiều khoảng trắng và phân tách nó. Tuy nhiên, một khoảng trắng đang được chèn vào giữa mọi phần tử:

>>> str1="a    b     c      d" # spaces are irregular
>>> str1
'a    b     c      d'
>>> str2=re.split("( )+", str1)
>>> str2
['a', ' ', 'b', ' ', 'c', ' ', 'd'] # 1 space element between!!!

Có cách nào tốt hơn để làm điều này?

Sau mỗi lần phân chia str2được thêm vào một danh sách.


1
Tôi đánh giá thấp câu hỏi này. Lý do là trong khi bản thân câu hỏi có liên quan, ví dụ đã cho không đủ khó để thực sự yêu cầu giải pháp được yêu cầu. Một regex sẽ được yêu cầu nếu bạn có các khối từ, khối số và bạn muốn tách chúng thành các biến khác nhau.
erikbwork

@erikbwork Tôi muốn xóa mục không gian không mong muốn trong chuỗi kết quả'str2'
user2763554

1
Có và bạn có thể đạt được điều đó chỉ bằng cách sử dụng str1.split(). Không cần một regex.
erikbwork

Câu trả lời:


176

Bằng cách sử dụng (, )bạn đang nắm bắt nhóm, nếu bạn chỉ cần loại bỏ chúng, bạn sẽ không gặp phải vấn đề này.

>>> str1 = "a    b     c      d"
>>> re.split(" +", str1)
['a', 'b', 'c', 'd']

Tuy nhiên, không cần regex, str.splitkhông có bất kỳ dấu phân cách nào được chỉ định sẽ phân chia phần này theo khoảng trắng cho bạn. Đây sẽ là cách tốt nhất trong trường hợp này.

>>> str1.split()
['a', 'b', 'c', 'd']

Nếu bạn thực sự muốn regex, bạn có thể sử dụng cái này ( '\s'đại diện cho khoảng trắng và nó rõ ràng hơn):

>>> re.split("\s+", str1)
['a', 'b', 'c', 'd']

hoặc bạn có thể tìm thấy tất cả các ký tự không phải khoảng trắng

>>> re.findall(r'\S+',str1)
['a', 'b', 'c', 'd']

4
Giữ cho nó đơn giản. str.splitchắc chắn là tốt nhất: D
jamylak

Làm thế nào tôi có thể sử dụng điều này nếu tôi có một chuỗi bắt đầu và kết thúc với không gian. ví dụ: 'abc de'. Đối với điều này, đầu ra là['', 'a', 'b', 'c', 'de', '']
Rakholiya Jenish

@RakholiyaJenishstr1.split()
jamylak

@jamylak string.split()là một lựa chọn. Tôi đã hỏi nếu nó có thể được thực hiện với regex quá?
Rakholiya Jenish

2
@RakholiyaJenish Bạn không thể sử dụng re.findalltùy chọn?
jamylak


7

Khi bạn sử dụng re.splitvà mẫu phân tách chứa các nhóm chụp, các nhóm được giữ lại ở đầu ra. Nếu bạn không muốn điều này, hãy sử dụng một nhóm không chụp thay thế.


2
Sử dụng str.splitcó lẽ là tốt hơn cho ví dụ của bạn. Tôi chỉ muốn giải thích lý do tại sao bạn có được hành vi bạn làm.
BrenBarn

2

Nó thực sự rất đơn giản. Thử cái này:

str1="a    b     c      d"
splitStr1 = str1.split()
print splitStr1

2
Tôi sẽ +1 cái này nhưng bạn đang sử dụng dấu chấm phẩy xấu xí.
jamylak

3
@jamylak Lol. Tôi sẽ thay đổi chúng. :) Thói quen sử dụng java và python!
chết tiệt

1
@ GururajY.S. Nếu bạn chỉ muốn phân chia trên cơ sở không gian, bạn chỉ cần sử dụngstringToSplit.split()
chết tiệt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.