2010-10-21 49 views
22

^(\s+) chỉ xóa khoảng trắng khỏi dòng đầu tiên. Làm cách nào để xóa khoảng trống phía trước khỏi tất cả các dòng?Python: sử dụng cụm từ thông dụng để xóa khoảng trắng khỏi tất cả các dòng

+0

khoảng trắng bao gồm ký tự xuống dòng, có nghĩa là mọi thứ sẽ kết thúc trên một dòng, nếu bạn sử dụng nó trên một chuỗi đa dòng. cho chúng tôi thấy một số đầu vào để chúng tôi có thể giúp hiểu câu hỏi! – rdrey

+0

@rdrey: Trên thực tế, '^' trong chế độ đa dòng khớp * sau * mỗi dòng mới, do đó sẽ không có vấn đề gì (ngoại trừ "\ n \ n"). Xem câu trả lời của tôi. – AndiDog

+0

cảm ơn sự chỉnh sửa đó. học một cái gì đó mới mỗi ngày: D – rdrey

Trả lời

24

mô-đun regex Python không mặc định multi-line ^ matching , vì vậy bạn cần chỉ định cờ đó một cách rõ ràng.

r = re.compile(r"^\s+", re.MULTILINE) 
r.sub("", "a\n b\n c") # "a\nb\nc" 

# or without compiling (only possible for Python 2.7+ because the flags option 
# didn't exist in earlier versions of re.sub) 

re.sub(r"^\s+", "", "a\n b\n c", flags = re.MULTILINE) 

# but mind that \s includes newlines: 
r.sub("", "a\n\n\n\n b\n c") # "a\nb\nc" 

Nó cũng có thể bao gồm các inline cờ để các mô hình:

re.sub(r"(?m)^\s+", "", "a\n b\n c") 

Một giải pháp dễ dàng hơn là để tránh biểu thức thông thường bởi vì các vấn đề ban đầu rất đơn giản:

content = 'a\n b\n\n c' 
stripped_content = ''.join(line.lstrip(' \t') for line in content.splitlines(True)) 
# stripped_content == 'a\nb\n\nc' 
+0

'"^\ s + "' cũng loại bỏ các dòng trống –

6

bạn có thể thử strip() nếu bạn muốn loại bỏ mặt trước và sau, hoặc lstrip() nếu trước

>>> s=" string with front spaces and back " 
>>> s.strip() 
'string with front spaces and back' 
>>> s.lstrip() 
'string with front spaces and back ' 

for line in open("file"): 
    print line.lstrip() 

Nếu bạn thực sự muốn sử dụng regex

>>> import re 
>>> re.sub("^\s+","",s) # remove the front 
'string with front spaces and back ' 
>>> re.sub("\s+\Z","",s) 
' string with front spaces and back' #remove the back 
1
nowhite = ''.join(mytext.split()) 

KHÔNG có khoảng trắng sẽ vẫn như bạn đã hỏi (mọi thứ được đặt thành một từ). Thông thường hữu ích hơn là tham gia mọi thứ với ' ' hoặc '\n' để giữ riêng các từ.

0

Bạn sẽ phải sử dụng tùy chọn re.MULTILINE:

re.sub("(?m)^\s+", "", text) 

Các "(? M)" một phần cho phép có nhiều dòng.

8

@AndiDog thừa nhận trong câu trả lời (hiện được chấp nhận) của mình rằng nó nhai các dòng mới liên tiếp.

Dưới đây là cách khắc phục sự thiếu hụt đó, được gây ra bởi thực tế là \n là khoảng trống và dấu tách dòng. Những gì chúng ta cần làm là tạo một lớp học lại chỉ bao gồm các ký tự khoảng trống ngoài dòng mới.

Chúng tôi muốn whitespace and not newline, không thể hiển thị trực tiếp trong lớp học lại. Hãy viết lại rằng dưới dạng not not (whitespace and not newline) tức là not(not whitespace or not not newline (cảm ơn, Augustus) tức là not(not whitespace or newline) tức là [^\S\n] trong ký hiệu re.

Vì vậy:

>>> re.sub(r"(?m)^[^\S\n]+", "", " a\n\n \n\n b\n c\nd e") 
'a\n\n\n\nb\nc\nd e' 
0

Bạn không thực sự cần biểu thức thông thường cho việc này hầu hết thời gian. Nếu bạn chỉ tìm cách để loại bỏ chung thụt đầu dòng trên nhiều dòng, hãy thử các textwrap mô-đun:

>>> import textwrap 
>>> messy_text = " grrr\n whitespace\n everywhere" 
>>> print textwrap.dedent(messy_text) 
grrr 
whitespace 
everywhere 

Lưu ý rằng nếu thụt đầu dòng là bất thường, điều này sẽ được duy trì:

>>> very_messy_text = " grrr\n \twhitespace\n everywhere" 
>>> print textwrap.dedent(very_messy_text) 
grrr 
     whitespace 
everywhere 
Các vấn đề liên quan