Friday, 17 July 2015

[Go] strings package - xử lý string

Xử lý strings chưa bao giờ là một công việc không nhàn chán đối với tôi, nhưng chán
không có nghĩa là không phải làm, vì chán thì vẫn phải làm, vậy nên đành làm cho nó chán mình.

Bài viết giới thiệu các function hữu ích thường dùng trong package strings của Golang, kèm theo các method tương ứng của Python

Bài viết thực hiện trên:
$ go version
go version go1.4.2 darwin/amd64
Tổng số function strong package strings:
$ godoc strings | grep ^func | grep -v 'func (' | wc -l
      43
1. func Contains(s, substr string) bool
Kiểm tra xem string ``s`` có chứa string ``substr`` hay không.


Go: ``strings.Contains("hvn", "vn") == true``
Python:
In [1]: 'vn' in 'hvn'
Out[1]: True
In [2]: 'vn' not in 'HVN'
Out[2]: True
Chú ý, như mọi public function trong Go, chữ cái đầu tiên được viết hoa, và động từ "contain" đã được chia cho ngôi thứ 3 nên phải có "s" ở cuối, tức "Contains" [giải thích về chia động từ ở thì hiện tại đơn trong tiếng Anh]

Cả Python đều phân biệt chữ hoa chữ thường, nên chữ thường là chữ thường, chữ hoa là chữ hoa!

2. func Fields(s string) []string
Biển đổi string đầu vào thành một array chứa các string con trong đó, phân cách bởi một hoặc nhiều ký tự whitespace (định nghĩa bởi unicode.IsSpace - bao gồm dấu cách, tab, dấu xuống dòng)

Python: cắt string thành 1 list, vị trí cắt là từ/ký tự được chỉ địnhj, nếu không chỉ định gì hoặc dùng None, Python sẽ cắt tại tất cả ký tự whitespace (space, tab, newline)
In [3]: "Đến PyMi   học  Python".split()
Out[3]: ['Đến', 'PyMi', 'học', 'Python']
In [4]: "Đến PyMi   học  Python".split("PyMi")
Out[4]: ['Đến ', '   học  Python']

3. func HasPrefix(s, prefix string) bool
Kiểm tra xem string ``s`` có bắt đầu bằng ``prefix`` hay không.

Python:
In [5]: "Pykachu".startswith("Py")
Out[5]: True
4. func HasSuffix(s, suffix string) bool
Kiểm tra xem string ``s`` có kết thúc bằng ``suffix`` hay không.

Python:
In [6]: "phimhay.mp4".endswith(('.flv', '.mp4', '.mkv'))
Out[6]: True
5. func Index(s, sep string) int
Trả về index của lần xuất hiện đầu tiên của ``sep`` trong s hoặc -1 nếu không tồn tại.

Python:
In [7]: "pythonpymi".index('y')
Out[7]: 1
Tương tự, LastIndex trả về index của lần xuất hiện cuối cùng (Python không có function tương ứng).

6. func Join(a []string, sep string) string
Nối các string trong array ``a`` thành một string, sử dụng ``sep`` làm dấu phân cách

Python:
In [8]: '-'.join('Cho tôi xin một vé đi học PyMi'.split())
Out[8]: 'Cho-tôi-xin-một-vé-đi-học-PyMi'
7. func Split(s, sep string) []string
Cắt string ``s`` bằng ``sep`` và trả về 1 slice chứa các substring sau khi cắt.
Nếu sep = "", trả về một slide gồm tất cả các ký tự trong s.
Vậy khi cần split tất cả các loại whitespace (cả space, cả tab...) thì dùng Fields(), còn chỉ split một ký tự bất kỳ thì dùng Split
SplitN dùng để Split với số substring được trả về chỉ định trong argument thứ 3.

Python: ``s.split(sep)``
Với sep="", Python không cần dùng function nào khác bởi một string strong Python đã là 1 iterable. Để xử lý từng ký tự, chỉ cần ``for c in s``
In [9]: 'Cho-tôi-xin-một-vé-đi-học-PyMi'.split('-')
Out[9]: ['Cho', 'tôi', 'xin', 'một', 'vé', 'đi', 'học', 'PyMi']
8. func Trim(s string, cutset string) string
Cắt bỏ ``cutset`` ở đầu vào cuối của string ``s``

Xem thêm TrimLeft, TrimRight, TrimSuffix
Python: cắt bỏ các ký tự a và b cho đến khi gặp một ký tự khác. Xem thêm lstrip và rstrip để cắt bỏ một bên
In [11]: "ababbbcccaaaaaabbb".strip('ab')
Out[11]: 'ccc'

9. func Replace(s, old, new string, n int) string
Thay thế ``old`` bằng ``new`` trong string ``s`` ``n` lần. Với n<0 thì không giới hạn số lần.

Python: ``s.replace(old,new,n)``
In [1]: "PythonPyMi".replace("Py", "Jy")
Out[1]: 'JythonJyMi'

10. ToLower, ToTitle, ToUpper
Như tên nó mô tả, các func trên trả về các string đã được biến đổi về dạng : chữ thường, viết hoa chữ đầu, chữa hoa - tương ứng.

Python: ``s.lower()``, ``s.title()``, s.upper()``

Code:
In [13]: "PYMI".lower()
Out[13]: 'pymi'
In [14]: "PYMI".lower().title()
Out[14]: 'Pymi'
In [15]: "PYMI".lower().title().upper()
Out[15]: 'PYMI'
Code Go cho tất cả:

http://play.golang.org/p/aI3VJfaOtO

10 là quá nhiều cho thằng lười, vậy nên nghỉ và đi chơi thôi :3

Tham khảo:
https://docs.python.org/3/library/stdtypes.html#string-methods

Hết.
Happy coding ~^.^~ meo meo