2.5 å—符串æ�œç´¢å’Œæ›¿æ�¢Â¶
问题¶
ä½ æƒ³åœ¨å—ç¬¦ä¸²ä¸æ�œç´¢å’ŒåŒ¹é…�指定的文本模å¼�
解决方案¶
对于简å�•çš„å—é�¢æ¨¡å¼�,直接使用 str.replace() 方法å�³å�¯ï¼Œæ¯”如:
>>> text = 'yeah, but no, but yeah, but no, but yeah'
>>> text.replace('yeah', 'yep')
'yep, but no, but yep, but no, but yep'
>>>
对于å¤�æ�‚的模å¼�,请使用 re 模å�—ä¸çš„ sub() 函数。
为了说明这个,å�‡è®¾ä½ 想将形å¼�为 11/27/2012 的日期å—符串改æˆ� 2012-11-27 。示例如下:
>>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
>>> import re
>>> re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
'Today is 2012-11-27. PyCon starts 2013-3-13.'
>>>
sub() 函数ä¸çš„第一个å�‚数是被匹é…�的模å¼�,第二个å�‚数是替æ�¢æ¨¡å¼�。å��æ–œæ� æ•°å—æ¯”如 \3 指å�‘å‰�é�¢æ¨¡å¼�çš„æ�•获组å�·ã€‚
å¦‚æžœä½ æ‰“ç®—ç”¨ç›¸å�Œçš„æ¨¡å¼�å�šå¤šæ¬¡æ›¿æ�¢ï¼Œè€ƒè™‘先编译它æ�¥æ��å�‡æ€§èƒ½ã€‚比如:
>>> import re
>>> datepat = re.compile(r'(\d+)/(\d+)/(\d+)')
>>> datepat.sub(r'\3-\1-\2', text)
'Today is 2012-11-27. PyCon starts 2013-3-13.'
>>>
å¦‚æžœä½ ä½¿ç”¨äº†å‘½å��分组,那么第二个å�‚数请使用 \g<group_name> ,如下
>>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
>>> import re
>>> re.sub(r'(?P<month>\d+)/(?P<day>\d+)/(?P<year>\d+)', r'\g<year>-\g<month>-\g<day>', text)
'Today is 2012-11-27. PyCon starts 2013-3-13.'
>>>
å¯¹äºŽæ›´åŠ å¤�æ�‚的替æ�¢ï¼Œå�¯ä»¥ä¼ 递一个替æ�¢å›žè°ƒå‡½æ•°æ�¥ä»£æ›¿ï¼Œæ¯”如:
>>> from calendar import month_abbr
>>> def change_date(m):
... mon_name = month_abbr[int(m.group(1))]
... return '{} {} {}'.format(m.group(2), mon_name, m.group(3))
...
>>> datepat.sub(change_date, text)
'Today is 27 Nov 2012. PyCon starts 13 Mar 2013.'
>>>
一个替�回调函数的�数是一个 match 对象,也就是 match() 或者 find() 返回的对象。
使用 group() 方法æ�¥æ��å�–特定的匹é…�部分。回调函数最å�Žè¿”回替æ�¢å—符串。
如果除了替æ�¢å�Žçš„ç»“æžœå¤–ï¼Œä½ è¿˜æƒ³çŸ¥é�“有多少替æ�¢å�‘生了,å�¯ä»¥ä½¿ç”¨ re.subn() æ�¥ä»£æ›¿ã€‚比如:
>>> newtext, n = datepat.subn(r'\3-\1-\2', text)
>>> newtext
'Today is 2012-11-27. PyCon starts 2013-3-13.'
>>> n
2
>>>
讨论¶
关于æ£åˆ™è¡¨è¾¾å¼�æ�œç´¢å’Œæ›¿æ�¢ï¼Œä¸Šé�¢æ¼”示的 sub() 方法基本已ç»�涵盖了所有。
其实最难的部分就是编写æ£åˆ™è¡¨è¾¾å¼�模å¼�ï¼Œè¿™ä¸ªæœ€å¥½æ˜¯ç•™ç»™è¯»è€…è‡ªå·±åŽ»ç»ƒä¹ äº†ã€‚