• 主页
  • 相册
  • 随笔
  • 目录
  • 存档
Total 244
Search AboutMe

  • 主页
  • 相册
  • 随笔
  • 目录
  • 存档

Python厨书笔记-3

2019-12-15

字符串与文本

1. 1. 使用多个界定符分割字符串

用途

  • 将一个字符串分割为多个字段,但是分隔符(还有周围的空格)并不是固定的

re.spilt

  • string.spilt并不允许有多个分隔符或者是分隔符周围不确定的空格

  • 可以获取分割字符

    • 获取分割字符在某些情况下也是有用的。 比如,你可能想保留分割字符串,用来在后面重新构造一个新的输出字符串
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    line = 'asdf fjdk; afed, fjek,asdf, foo'

    re.split(r'[;,\s]\s*', line)
    # ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

    re.split(r'(;|,|\s)\s*', line)
    # ['asdf', ' ', 'fjdk', ';', 'afed', ',', 'fjek', ',', 'asdf', ',', 'foo']

    re.split(r'(?:;|,|\s)\s*', line)
    # ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

正则式

string text = “a|e|s|v”; regex:[a|e|s] result:结果就是匹配字符a、e、|三个字符,这个跟(a|e|s)有区别的,区别就是(a|e|s)匹配的是a、e、s三个字符的随意一个,三个中的任意一个,这是的|是元字符

  • 非捕获分组(non-capturing group)

    • 非捕获分组类似普通的捕获分组,只是在开括号后紧跟一个问号和冒号(?:…),这样的括号叫做非捕获分组,它只能限定量词的作用范围,不捕获任何文本。在引用分组时,分组的编号同样会按开括号出现的顺序从左到右递增,只是必须以捕获分组为准,非捕获分组会略过

      1
      2
      3
      4
      re.search(r"(\d{4})-(\d{2})-(\d{2})","2019-11-01").group(2)
      11
      re.search(r"(?:\d{4})-(\d{2})-(\d{2})","2019-11-01").group(1)
      11

2. 2. 字符串开头或结尾匹配

用途

  • 代替切片或正则式:更快更优雅

  • 通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀,URL Scheme等等

str.startswith()、str.endswith()

  • 检查多种匹配可能,只需要将所有的匹配项放入到一个元组中去, 然后传给 startswith() 或者 endswith() 方法
1
2
3
4
5
>>> filename = 'spam.txt'
>>> filename.endswith('.txt')
True
>>> filename.startswith('file:')
False

3. 3. 用Shell通配符匹配字符串

用途

  • 使用 Unix Shell 中常用的通配符(比如 *.py , Dat[0-9]*.csv 等)去匹配文本字符串

fnmatch.fnmatch、fnmatch.fnmatchcase

  • fnmatch() 函数使用底层操作系统的大小写敏感规则来匹配模式
    • 不同的系统是不一样的,如Windows上大小写不敏感
  • fnmatchcase()完全使用你的模式大小写匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# On Windows
>>> fnmatch('foo.txt', '*.TXT')
True
>>> fnmatchcase('foo.txt', '*.TXT')
False

addresses = [
'5412 N CLARK ST',
'1060 W ADDISON ST',
'1039 W GRANVILLE AVE',
'2122 N CLARK ST',
'4802 N BROADWAY',
]
>>> [addr for addr in addresses if fnmatchcase(addr, '54[0-9][0-9] *CLARK*')]
['5412 N CLARK ST']

4. 4. 字符串匹配和搜索

用途

  • 使用同一个模式去做多次匹配,你应该先将模式字符串预编译为模式对象

    1
    2
    3
    4
    5
    >>> datepat = re.compile(r'\d+/\d+/\d+')
    >>> datepat.match(text1)
    True
    >>> datepat.match(text2)
    False

5. 5. 字符串的搜索替换

用途

  • 如题

方法

  • 对于简单的:re.replace('oldstring','newstring')

  • 对于复杂的:re.sub('oldre','newre'[or callback function],string)

    1
    2
    3
    4
    >>> 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.'
    • 反斜杠数字指向前面模式的捕获组号
  • 更复杂的:将newre改为回调函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> 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))
    ...
    >>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
    >>> datepat = re.compile(r'(\d+)/(\d+)/(\d+)')
    >>> datepat.sub(change_date, text)
    'Today is 27 Nov 2012. PyCon starts 13 Mar 2013.'

6. 6. 字符串忽略大小写的搜索替换

用途

  • 如题

re.IGNORECASE

1
2
3
4
5
>>> text = 'UPPER PYTHON, lower python, Mixed Python'
>>> re.findall('python', text, flags=re.IGNORECASE)
['PYTHON', 'python', 'Python']
>>> re.sub('python', 'snake', text, flags=re.IGNORECASE)
'UPPER snake, lower snake, Mixed snake'
  • 改进:替换字符串自动跟被匹配字符串的大小写保持一致
    • 参照厨书2.6

7. 7. 最短匹配模式

用途

  • 正则表达式中*操作符是贪婪匹配,会查找最长的可能匹配。现在想修改它变成查找最短的可能匹配

方法

  • 模式中的*操作符后面加上?修饰符,使得匹配变成非贪婪模式,从而得到最短的匹配

8. 8. 多行匹配模式

用途

  • 如题

re.DOTALL

  • 让正则表达式中的点(.)匹配包括换行符在内的任意字符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> text2 = '''/* this is a
    ... multiline comment */
    ... '''

    >>> comment = re.compile(r'/\*(.*?)\*/')
    >>> comment.findall(text2)
    []

    >>> comment = re.compile(r'/\*(.*?)\*/', re.DOTALL)
    >>> comment.findall(text2)
    [' this is a\n multiline comment ']

9. =======

title: python厨书笔记-3
tags:

  • backup
    toc: true
    abbrlink: 94de980a
    date: 2019-12-15 09:05:11

字符串与文本

10. 1. 使用多个界定符分割字符串

用途

  • 将一个字符串分割为多个字段,但是分隔符(还有周围的空格)并不是固定的

re.spilt

  • string.spilt并不允许有多个分隔符或者是分隔符周围不确定的空格

  • 可以获取分割字符

    • 获取分割字符在某些情况下也是有用的。 比如,你可能想保留分割字符串,用来在后面重新构造一个新的输出字符串
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    line = 'asdf fjdk; afed, fjek,asdf, foo'

    re.split(r'[;,\s]\s*', line)
    # ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

    re.split(r'(;|,|\s)\s*', line)
    # ['asdf', ' ', 'fjdk', ';', 'afed', ',', 'fjek', ',', 'asdf', ',', 'foo']

    re.split(r'(?:;|,|\s)\s*', line)
    # ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

正则式

string text = “a|e|s|v”; regex:[a|e|s] result:结果就是匹配字符a、e、|三个字符,这个跟(a|e|s)有区别的,区别就是(a|e|s)匹配的是a、e、s三个字符的随意一个,三个中的任意一个,这是的|是元字符

  • 非捕获分组(non-capturing group)

    • 非捕获分组类似普通的捕获分组,只是在开括号后紧跟一个问号和冒号(?:…),这样的括号叫做非捕获分组,它只能限定量词的作用范围,不捕获任何文本。在引用分组时,分组的编号同样会按开括号出现的顺序从左到右递增,只是必须以捕获分组为准,非捕获分组会略过

      1
      2
      3
      4
      re.search(r"(\d{4})-(\d{2})-(\d{2})","2019-11-01").group(2)
      11
      re.search(r"(?:\d{4})-(\d{2})-(\d{2})","2019-11-01").group(1)
      11

11. 2. 字符串开头或结尾匹配

用途

  • 代替切片或正则式:更快更优雅

  • 通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀,URL Scheme等等

str.startswith()、str.endswith()

  • 检查多种匹配可能,只需要将所有的匹配项放入到一个元组中去, 然后传给 startswith() 或者 endswith() 方法
1
2
3
4
5
>>> filename = 'spam.txt'
>>> filename.endswith('.txt')
True
>>> filename.startswith('file:')
False

12. 3. 用Shell通配符匹配字符串

用途

  • 使用 Unix Shell 中常用的通配符(比如 *.py , Dat[0-9]*.csv 等)去匹配文本字符串

fnmatch.fnmatch、fnmatch.fnmatchcase

  • fnmatch() 函数使用底层操作系统的大小写敏感规则来匹配模式
    • 不同的系统是不一样的,如Windows上大小写不敏感
  • fnmatchcase()完全使用你的模式大小写匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# On Windows
>>> fnmatch('foo.txt', '*.TXT')
True
>>> fnmatchcase('foo.txt', '*.TXT')
False

addresses = [
'5412 N CLARK ST',
'1060 W ADDISON ST',
'1039 W GRANVILLE AVE',
'2122 N CLARK ST',
'4802 N BROADWAY',
]
>>> [addr for addr in addresses if fnmatchcase(addr, '54[0-9][0-9] *CLARK*')]
['5412 N CLARK ST']

13. 4. 字符串匹配和搜索

用途

  • 使用同一个模式去做多次匹配,你应该先将模式字符串预编译为模式对象

    1
    2
    3
    4
    5
    >>> datepat = re.compile(r'\d+/\d+/\d+')
    >>> datepat.match(text1)
    True
    >>> datepat.match(text2)
    False

14. 5. 字符串的搜索替换

用途

  • 如题

方法

  • 对于简单的:re.replace('oldstring','newstring')

  • 对于复杂的:re.sub('oldre','newre'[or callback function],string)

    1
    2
    3
    4
    >>> 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.'
    • 反斜杠数字指向前面模式的捕获组号
  • 更复杂的:将newre改为回调函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> 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))
    ...
    >>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
    >>> datepat = re.compile(r'(\d+)/(\d+)/(\d+)')
    >>> datepat.sub(change_date, text)
    'Today is 27 Nov 2012. PyCon starts 13 Mar 2013.'

15. 6. 字符串忽略大小写的搜索替换

用途

  • 如题

re.IGNORECASE

1
2
3
4
5
>>> text = 'UPPER PYTHON, lower python, Mixed Python'
>>> re.findall('python', text, flags=re.IGNORECASE)
['PYTHON', 'python', 'Python']
>>> re.sub('python', 'snake', text, flags=re.IGNORECASE)
'UPPER snake, lower snake, Mixed snake'
  • 改进:替换字符串自动跟被匹配字符串的大小写保持一致
    • 参照厨书2.6

16. 7. 最短匹配模式

用途

  • 正则表达式中*操作符是贪婪匹配,会查找最长的可能匹配。现在想修改它变成查找最短的可能匹配

方法

  • 模式中的*操作符后面加上?修饰符,使得匹配变成非贪婪模式,从而得到最短的匹配

17. 8. 多行匹配模式

用途

  • 如题

re.DOTALL

  • 让正则表达式中的点(.)匹配包括换行符在内的任意字符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> text2 = '''/* this is a
    ... multiline comment */
    ... '''

    >>> comment = re.compile(r'/\*(.*?)\*/')
    >>> comment.findall(text2)
    []

    >>> comment = re.compile(r'/\*(.*?)\*/', re.DOTALL)
    >>> comment.findall(text2)
    [' this is a\n multiline comment ']

06c0344feaec636bf871d04fca7302704c633fd8

  • Cookbook
  • Program Language
  • Python
  • Cookbook
ctf-wifi-hacking实验
Python厨书笔记-2
  1. 1. 1. 1. 使用多个界定符分割字符串
  2. 2. 2. 2. 字符串开头或结尾匹配
  3. 3. 3. 3. 用Shell通配符匹配字符串
  4. 4. 4. 4. 字符串匹配和搜索
  5. 5. 5. 5. 字符串的搜索替换
  6. 6. 6. 6. 字符串忽略大小写的搜索替换
  7. 7. 7. 7. 最短匹配模式
  8. 8. 8. 8. 多行匹配模式
    1. 8.1. 9. =======
  9. 9. 10. 1. 使用多个界定符分割字符串
  10. 10. 11. 2. 字符串开头或结尾匹配
  11. 11. 12. 3. 用Shell通配符匹配字符串
  12. 12. 13. 4. 字符串匹配和搜索
  13. 13. 14. 5. 字符串的搜索替换
  14. 14. 15. 6. 字符串忽略大小写的搜索替换
  15. 15. 16. 7. 最短匹配模式
  16. 16. 17. 8. 多行匹配模式
© 2024 何决云 载入天数...