python cookbook 2字符串(4)

16.轉換文本爲固定大小的列,文本的排版html

 textwrappython

>> s = "Look into my eyes, look into my eyes, the eyes, the eyes, \
... the eyes, not around the eyes, don't look around the eyes, \
... look into my eyes, you're under."
>>> import textwrap
>>> print textwrap.fill(s,70)
Look into my eyes, look into my eyes, the eyes, the eyes, the eyes,
not around the eyes, don't look around the eyes, look into my eyes,
you're under.
textwrap.fill()能夠設定每行最大字符個數,但不會對單詞進行分割,
initial_indent,subsequent_indent,標誌位能夠設定起始和終止字符
>>> print textwrap.fill(s,40,initial_indent='    ')
    Look into my eyes, look into my
eyes, the eyes, the eyes, the eyes, not
around the eyes, don't look around the
eyes, look into my eyes, you're under.

17.處理文本中的HTML 和XML字符(僅適用python3)正則表達式

Python 2有兩種字符串類型:Unicode字符串和非Unicode字符串。Python 3只有一種類型:Unicode字符串(Unicode strings)spa

若是你想要用HTML和XML的通訊文本取代他們的字符如&entity;或者 &#code;,你須要生成文本並跳過某些字符
code

用html.escape能夠取代某些特殊字符如'<','>'
>>> s = 'Elements are written as "<tag>text</tag>".'
>>> import html
>>> print(s)
Elements are written as "<tag>text</tag>".
>>> print(html.escape(s))
Elements are written as &quot;&lt;tag&gt;text&lt;/tag&gt;&quot;.
>>> # 關閉escape的quote
>>> print(html.escape(s, quote=False))
Elements are written as "&lt;tag&gt;text&lt;/tag&gt;".
若是你要生成ASCII字符,能夠用 errors='xmlcharrefreplace'以便不一樣的IO功能處理
>>> s = 'Spicy Jalapeño'
>>> s.encode('ascii', errors='xmlcharrefreplace')
b'Spicy Jalape&#241;o'
若是因爲某些緣由,你收到一些包含一些字符的原始文本,想要手動替換,你能夠用不一樣的html或xml相關的語法處理
>>> s = 'Spicy &quot;Jalape&#241;o&quot.'
>>> from html.parser import HTMLParser
>>> p = HTMLParser()
>>> p.unescape(s)
'Spicy "Jalapeño".'
>>>
>>> t = 'The prompt is &gt;&gt;&gt;'
>>> from xml.sax.saxutils import unescape
>>> unescape(t)
'The prompt is >>>'

18.切分文本orm

若是你有一個字符文本
text = 'foo = 23 + 42 * 10'
爲了切分文本,你不只須要匹配文本,還要能識別要替換的文本
tokens = [('NAME', 'foo'), ('EQ','='), ('NUM', '23'), ('PLUS','+'),
('NUM', '42'), ('TIMES', '*'), ('NUM', '10')]
用於捕捉的的正則表達式以下
import re
NAME = r'(?P<NAME>[a-zA-Z_][a-zA-Z_0-9]*)'
NUM = r'(?P<NUM>\d+)'
PLUS = r'(?P<PLUS>\+)'
TIMES = r'(?P<TIMES>\*)'
EQ= r'(?P<EQ>=)'
WS= r'(?P<WS>\s+)'
master_pat = re.compile('|'.join([NAME, NUM, PLUS, TIMES, EQ, WS]))

?P<TOKENNAME>語法用於給正則表達式命名xml

scanner()能夠生成一個掃瞄器對象,在一次掃描中對提供的文本屢次調用match()方法,若是中間有未匹配到的字符會返回Nonehtm

正則表達式的順序也很重要,你須要確保長的匹配表達在前,
對象

>>> scanner = master_pat.scanner('foo = 42')
>>> scanner.match()
<_sre.SRE_Match object at 0x100677738>
>>> _.lastgroup, _.group()#'_'表示上一次執行的返回值,這裏指scanner.match()
('NAME', 'foo')
>>> scanner.match()
<_sre.SRE_Match object at 0x100677738>
>>> _.lastgroup, _.group()
('WS', ' ')
>>> scanner.match()
<_sre.SRE_Match object at 0x100677759>
>>> _.lastgroup, _.group()
('EQ', '=')
>>> scanner.match()
<_sre.SRE_Match object at 0x100677768>
>>> _.lastgroup, _.group()
('WS', ' ')
>>> scanner.match()
<_sre.SRE_Match object at 0x1006777390>
>>> _.lastgroup, _.group()
('NUM', '42')
>>> scanner.match()

20.byte字符的文本處理(僅python3支持)token

byte字符一般支持大多數文本操做,大多數操做對byte字符一樣有效,但也有例外

>>> b = b'Hello World'
>>> b
b'Hello World'
>>> b[0]
72
>>> b[1]
101
byte字符一般也沒法進行字符格式化操做
>>> b'%10s %10d %10.2f' % (b'ACME', 100, 490.1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for %: 'bytes' and 'tuple'
但能以文本字符的方式進行格式操做
>>> '%10s %10d %10.2f' % (b'ACME', 100, 490.1)
"   b'ACME'        100     490.10"
相關文章
相關標籤/搜索