re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法:
re.match(pattern, string, flags=0)
函数参数说明:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见上方可选标志表格 |
匹配成功re.match方法返回一个匹配的对象,否则返回None。
实例及输出:
第一个匹配成功,第二个则失败
re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern, string, flags=0)
函数参数说明:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见上方可选标志表格 |
匹配成功re.search方法返回一个匹配的对象,否则返回None。
实例及输出:
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,re函数使用。
提前编译可减少多次正则匹配的运行时间
语法格式为:
re.compile(pattern[, flags])
参数:
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
用法1
直接使用的语法格式为:
re.findall(pattern, string, flags)
参数:
实例及输出:
用法2
compile后使用findall的语法格式为:
re.findall(string, pos, endpos)
参数:
实例及输出:
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
re.finditer(pattern, string, flags=0)
实例及输出:
split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
re.split(pattern, string[, maxsplit=0, flags=0])
参数:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
maxsplit | 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见上方可选标志表格 |
实例:
用正则表达式切分字符串比用固定的字符更灵活,请看正常的切分代码:
>>> 'a b c'.split(' ')
['a', 'b', '', '', 'c']
发现无法识别连续的空格,用正则表达式试试:
>>> re.split(r'\s+', 'a b c')
['a', 'b', 'c']
无论多少个空格都可以正常分割。加入,
试试:
>>> re.split(r'[\s\,]+', 'a,b, c d')
['a', 'b', 'c', 'd']
再加入;
试试:
>>> re.split(r'[\s\,\;]+', 'a,b;; c d')
['a', 'b', 'c', 'd']
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法 | 描述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 |
实例及输出:
Python 的re模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数:
前三个为必选参数,后两个为可选参数。
实例及输出:
repl 参数可以是一个函数
以下实例中将字符串中的匹配的数字乘于 2:
实例及输出:
需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0
:
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
由于\d+
采用贪婪匹配,直接把后面的0
全部匹配了,结果0*
只能匹配空字符串了。
必须让\d+
采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0
匹配出来,加个?
就可以让\d+
采用非贪婪匹配:
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')
实例 | 描述 |
---|---|
python | 匹配 "python". |
实例 | 描述 |
---|---|
[Pp]ython | 匹配 "Python" 或 "python" |
rub[ye] | 匹配 "ruby" 或 "rube" |
[aeiou] | 匹配中括号内的任意一个字母 |
[0-9] | 匹配任何数字。类似于 [0123456789] |
[a-z] | 匹配任何小写字母 |
[A-Z] | 匹配任何大写字母 |
[a-zA-Z0-9] | 匹配任何字母及数字 |
[^aeiou] | 除了aeiou字母以外的所有字符 |
[^0-9] | 匹配除了数字外的字符 |
实例 | 描述 |
---|---|
. | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\w | 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 |
\W | 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 |
首先宏哥根据测试场景进行测试用例的设计,如下:
1.分别在搜狗和必应搜索框“北京宏哥”
2.分别点击查询,观察查询结果
3.分别将查询结果取到
4.提取结果中的数字,保存在变量中
5.对比两个数字的大小
# coding=utf-8🔥
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-04-10
@author: 北京-宏哥
公众号:北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货)
Project: 《最新出炉》系列入门篇-Python+Playwright自动化测试-52- 字符串操作 - 下篇
'''
# 3.导入模块
import re
from playwright.sync_api import Playwright, sync_playwright, expect
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://www.sogou.com")
page.locator("#query").fill("北京宏哥")
page.locator("#stb").click()
page.wait_for_timeout(1000)
# 定位 搜狗为您找到相关结果约xxxx个 这个元素
result = page.locator("//*[@id='main']/div[1]/p")
# 获取该字段值 "搜索工具 搜狗为您找到相关结果约xxxxx个"
result_string = result.inner_text()
print(result_string)
regEx = "[^0-9]"
search_number = re.sub(regEx,"", result_string)
print(search_number)
page.goto("https://cn.bing.com")
page.locator("#sb_form_q").fill("北京宏哥")
page.locator("#search_icon").click()
page.wait_for_timeout(1000)
# 定位 必应为xxxx条结果 这个元素
result1 = page.locator("//*[@id='b_tween_searchResults']/span")
# 获取该字段值 "约 xxx 个结果"
result_string1 = result1.inner_text()
print(result_string1)
st2 = re.sub(regEx, "",result_string1)
print(st2)
# 首先将两个数都转换为int 数据
a_N = int(search_number)
b_N = int(st2)
# 搜狗和必应的搜索结果对比
if (a_N > b_N):
print("搜狗牛逼,搜狗威武!!!")
else:
print("必应牛逼,必应威武!!!");
page.wait_for_timeout(20000)
page.close()
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:
2.运行代码后电脑端的浏览器的动作。如下图所示:
好了,关于字符串的操作,宏哥就介绍到这里,其实两种方法各有千秋,如果其中一种不太合适或者不好用,不妨换另一种方法试一下,没准就成功了。不要钻牛角尖,一条道走到黑哈。还有就是正则表达式的语法,自己去查一下,看一下,半个小时就可以掌握的差不多了,然后要注意实践啊,不然吃一顿饭就忘记了。