Python 爬虫学习笔记之正则表达式

  • Post category:Python

Python爬虫学习笔记之正则表达式

正则表达式是一种强大的文本处理工具,可以用于各种文本处理,如数据清洗、本分、信息提取等。在Python爬虫中,正则达式也是一种常用的工具,用于从HTML页面中提取所需的信息。本攻略将详细讲解Python中re正则表达式模块,包括正则表达式的基本语法、用函数等内容。

正则表达式的基本语法

正则表达式是由普通字符和元字符组成的字符串。普通表示它本身,元字符则具有特殊的含义。下面是一些常用的元字符:

  • .:匹配任意字符,除了换行符。
  • ^:匹配字符串的开头。
  • $:匹配字符串的结尾。
  • *:匹配前面的字符零次或多次。
  • +:匹配前面的字符一次或多次。
  • ?:匹配前面的字符零次或一次。
  • {m}:匹配前面字符m次。
  • {m,n}:匹配前面的字符m到n次。
  • []:匹配括号中的任意一个字符。
  • |匹配左右边任意一个表达式。
  • ():分组,将其中的表达式为一个整体。

下面是一些常用的正则表达式示例:

  • 匹配一个数字:\d
  • 匹配一个字母:\w
  • 匹配空格:\s
  • 匹配一个非数字:\D
  • 匹配一个非字母:\W
  • 匹配一个非空格:\S

常用正则表达式函数

re.match()函数

re.match()函数用于字符串的开头匹配正则表达式。如果匹配成功,返回一个匹配对象;否则返回None。下面是一个例子,演示何使用re.match()函数从字符串的开头匹配正则表达式:

import re

text = 'Hello, world!'
pattern = r'Hello'
result = re.match(pattern, text)
if result:
    print('Match found:', result.group())
else:
    print('Match not found')

在上面的代码中,我们使用re.match()函数从字符串的开头匹配正则表达式。如果匹配成功,输出结果为Match found: Hello;否则输出结果为Match not found

re.search()函数

re.search()函数用于在字符串中搜索正则表达式的第一个匹配项。如果匹配成功,返回一个匹配对象;否则返回None。下面是一个例子,示如何使用re.search()函数在字符串中搜索正则表达式的第一个匹配项:

import re

text = 'Hello, world!'
pattern = r'world'
result = re.search(pattern, text)
if result:
    print('Match found:', result.group())
else:
    print('Match not found')

在上面的代码中,我们使用re.search()函数在字符串中搜索正则表达式的第一个匹配项。如果匹配成功,输出结果为Match found: world;否则输出结果为Match not found

re.findall()函数

re.findall()函数用于在字符串中搜索正则表达式的所有匹配项,并返回一个列表。下面是一个例子,演示如何使用re.findall()函数在字符串中搜索正则表达式的所有匹配项:

import re

text = 'The quick brown fox jumps over the lazy dog.'
pattern = r'\w+'
result = re.findall(pattern, text)
print(result)

在上面的代码中,我们使用re.findall()函数在字符串中搜索正则表达式的所有匹配项。\w+表示匹配一个或多个字母、数字、下划线。运行代码后,输出结果为['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']

re.sub函数

re.sub()函数用于在字符串中搜索正则表达式的所有匹配项,并将其替换为指定的字符串。下面是一个例子,演示使用re.sub()函数在字符串中搜索正则表达式的所有匹配项,并将其替换为指定的字符串:

import re

text = 'The quick brown fox jumps over the lazy dogpattern = r'\s'
replace = '-'
result = re.sub(pattern, replace, text)
print(result)

在上面的代码中,我们使用re.sub()函数在字符串中搜索正则表达式的所有匹配项,并将其替换指定的字符串。\s表示匹配一个空白字符,-表示将匹配到的空白字符替换为-。运行代码后,输出结果为The-quick-brown-fox-jumps-over-the-lazy-dog.

re.split函数

re.split()函数用于在字符串中搜索正则表达式的所有匹配项,并将字符串分割为一个列表。下面是一个例子,演示使用re.split()函数在字符串中搜索正则表达式的所有匹配项,并将字符串分割为一个列表:

import re

text = 'The quick brown fox jumps over the lazy dog.'
pattern = r'\s+'
result = re.split(pattern, text)
print(result)

在上面的代码中,我们使用re.split()函数在字符串中搜索正则表达式的所有匹配项,并将字符串分割为一个列表。\s+表示匹配一个或多个空白字符。运行代码后,输出结果为['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog.']

示例说明

示例1:匹配文本中的所有数字

下面一个例子,演示如何使用正则表达式匹配文本中的所有数字:

import re

text = 'The answer is 42.'
pattern = r'\d+'
result = re.findall(pattern, text)
print(result)

在上面的代码中,我们使用正则表达式\d+匹配文本中的所有数字。\d表示匹配一个数字,+表示匹配前面字符一次或多次。运行代码后,输出结果为['42']

示例2:匹配文本中的所有单词

下面是另一个例子,演示如何使用正则表达式匹配文本中的所有词:

import re

text = 'The quick brown fox jumps over the lazy dog.'
pattern = r'\w+'
result = re.findall(pattern, text)
print(result)

在上面的代码中,我们使用正则表达式\w+匹配文本中的所有单词。\w表示匹配一个字母、数字或下划线,+`表示匹配前面的字符一次或多次。运行代码后,输出结果为文本中的单词。

总结

本攻略详细讲解了Python中re正则表达式模块,包括正则表达式的基本语法、常用函数等内容。正则表达式是一种强大的文处理工具,熟练掌握正则表达式用法可以大大提高工作效率。演示了如何使用正则表达式搜索本,并将文本中的数字替换为指定的字符串,以及如何使用正则表达式搜索文本中所有单词。希望读者可以通过这些示例更好地理解正则表达式的应用。

示例1:提取HTML标签中的属性值

下面是一个例子,演示如何使用正则表达式提取HTML标签中的属性值:

import re

text = '<a href="https://www.example.com">Example</a>'
pattern = r'<a href="([^"]+)">([^<]+)</a>'
result = re.search(pattern, text)
if result:
    print('Match found:', result.group())
    print('URL:', result.group(1))
    print('Text:', result.group(2))
else:
    print('Match not found')

在上面的代码中,我们使用正则表达式<a href="([^"]+)">([^<]+)</a>提取HTML标签中的href属性值和文本内容。[^+表示匹配一个或多个非双引号字符,[^<]+表示匹配一个或多个非小于号字符。运行代码后输出结果为Match found: <a href="https://www.example.com">Example</a>URL: https://www.example.comText: Example

示例2:提取JSON字符串中的键值对

下面是另一个例子,演示如何使用正则表达式取JSON字符串中的键值对:

import re

text = '{"name": "John", "age": 30, "city": "New York"}'
pattern = r'"(\w+)":\s*"([^"]+)"'
result = re.findall(pattern, text)
if result:
    print('Matches found:', result)
    for key, value in result:
        print(key, ':', value)
else:
    print('Matches not found')

在上面的代码中,我们使用正则表达式"(\w+)":\s*"([^"]+)"提取JSON字符串中的键值对。\w+表示匹配一个或多个字母、数字、下划线,[^”]+表示匹配一个或多个非双引号字符。()表示将\w+[^”]+匹配到的字符串作捕获组。\s*表示匹配零个或多个空格字符。findall()函数可以返回所有匹配的结果。运行代码后,输出结果为Matches found: [(‘name’, ‘John’), (‘age’, ’30’), (‘city’, ‘New York’)]`和每个键值对的具体内容。