Делая утверждения в ежедневной работе по автоматизированному тестированию, мы часто можем столкнуться со сценариями. Найдите набор чисел или определенные ключевые слова в строке вместо того, чтобы утверждать строку как результат. На данный момент нам нужно работать со строкой. Брат Хонг представляет здесь два метода: обычный метод и функцию разделения строки (split()).
Брат Хун расскажет здесь о своей бессмысленной тестовой сцене, это только для обучения и справки. Затем проведите автоматическое тестирование, как сказал брат Хун. Тестовый сценарий: Найдите «Брат Пекин Хун» в Ду Нян или других поисковых системах. После завершения поиска результаты поиска будут возвращены и сообщат вам, сколько «Брат Пекин» было найдено. . Хун Гэ использует Sogou и Bing для поиска соответственно, а затем сравнивает, кто из них нашел больше «Пекин Хун Гэ», а затем использует сравнение, чтобы показать, чьи поисковые способности сильны (больше результатов поиска указывает на сильные поисковые способности).
Что касается извлечения ключевых слов из этой строки с помощью регулярных выражений, брат Хонг подробно расскажет здесь о концепции регулярности. Если вам интересно, вы можете проверить это самостоятельно. Но тестовый сценарий, упомянутый выше братом Хонгом, требует этой операции (re.sub).
Что такое регулярное выражение?
Регулярное выражение — это логическая формула, которая работает со строками (включая обычные символы (например, буквы от a до z) и специальными символами (называемыми «метасимволами»)), в которой используются некоторые предопределенные конкретные символы и комбинация этих конкретных символов. символы образуют «строку правила». Эта «строка правила» используется для выражения логики фильтрации строк. Регулярное выражение — это текстовый шаблон, описывающий одну или несколько строк, которые необходимо сопоставить при поиске текста.
Что могут регулярные выражения?
Строки — наиболее часто используемая структура данных в программировании, и необходимость работы со строками возникает практически везде. Например, когда мы пишем сканер для сбора данных, мы сначала получаем исходный код веб-страницы, но как нам извлечь действительные данные?
Регулярное выражение — это специальная последовательность символов, которая поможет вам легко проверить, соответствует ли строка определенному шаблону. Начиная с версии 1.5 в Python добавлен модуль re, который предоставляет шаблоны регулярных выражений в стиле Perl. Модуль re обеспечивает полную функциональность регулярных выражений в языке Python.
потому что Строки PythonТакже используется сам по себе\
побег,Так что будьте особенными
s = 'ABC\\-001' # Строки Python
# Соответствующее регулярное строка выражения становится:
# 'ABC\-001'
Поэтому рекомендуетсяделатьиспользоватьPythonизr
префикс,Нет нужды рассматривать вопрос о побеге:
s = r'ABC\-001' # Строки Python
# Соответствующее регулярное строка выражения без изменений:
# 'ABC\-001'
Шаблон регулярного выражения
Строки шаблонов используют специальный синтаксис для представления регулярного выражения:
Буквы и цифры представляют собой сами себя. Шаблон регулярного выражения, в котором буквы и цифры соответствуют одной и той же строке.
Большинство букв и цифр имеют другое значение, если им предшествует обратная косая черта.
Знаки препинания совпадают только в том случае, если они экранированы, в противном случае они имеют особое значение.
Саму обратную косую черту необходимо экранировать обратной косой чертой.
Поскольку регулярные выражения обычно содержат обратную косую черту, для их представления лучше использовать необработанные строки. Элементы шаблона (например, r'\t', эквивалентные \t) соответствуют соответствующим специальным символам.
В следующей таблице перечислены специальные элементы грамматики шаблона регулярного выражения. Если вы используете модель, указав необязательный параметр флага, значение некоторых элементов модели изменится.
модель | описывать |
---|---|
^ | Соответствует началу строки |
$ | Соответствует концу строки. |
. | Соответствует любому символу, кроме символов новой строки. Если указан флаг re.DOTALL, может быть сопоставлен любой символ, включая символы новой строки. |
... | Используется для обозначения группы символов, перечисленных отдельно: amk соответствует «a», «m» или «k». |
^... | Символы, не входящие в []: ^abc соответствует символам, кроме a, b, c. |
re* | Соответствует 0 или более выражениям. |
re+ | Соответствует одному или нескольким выражениям. |
re? | Соответствует 0 или 1 фрагменту, определенному предыдущим регулярным выражением, нежадным способом. |
re{ n} | Сопоставьте n предыдущих выражений. Например, "o{2}" не может соответствовать "o" в слове "Bob", но может соответствовать двум "o" в слове "food". |
re{ n,} | Точно соответствует n предыдущим выражениям. Например, «o{2,}» не может соответствовать «o» в «Bob», но может соответствовать всем «o» в «foooood». «o{1,}» эквивалентно «o+». «o{0,}» эквивалентно «o*». |
re{ n, m} | Сопоставьте n и m раз фрагмент, определенный предыдущим регулярным выражением, жадный режим |
a|b | совпадение a или b |
(re) | Соответствует выражению в круглых скобках, также представляющему группу. |
(?imx) | Регулярные выражения содержат три необязательных флага: i, m или x. Влияет только на область в скобках. |
(?-imx) | Регулярное выражение отключает необязательные флаги i, m или x. Влияет только на область в скобках. |
(?: re) | Похож на (...), но не представляет группу |
(?imx: re) | Используйте дополнительные флаги i, m или x в скобках. |
(?-imx: re) | Не используйте дополнительные флаги i, m или x в скобках. |
(?#...) | Комментарий. |
(?= re) | Прямой положительный разделитель. Успешно, если содержащееся регулярное выражение, обозначаемое ... , успешно соответствует текущей позиции, в противном случае оно завершается неудачно. Но как только содержащееся выражение будет опробовано, механизм сопоставления вообще не улучшится; оставшейся части шаблона все равно придется проверять правую сторону разделителя. |
(?! re) | Разделитель прямого отрицания. Противоположно положительному разделителю; выполняется успешно, если содержащееся выражение не может быть сопоставлено в текущей позиции в строке. |
(?> re) | Сопоставление независимых шаблонов, исключающее возврат. |
\w | Сопоставление цифр, букв и подчеркиваний |
\W | Соответствует нецифровым буквам и подчеркиваниям. |
\s | Соответствует любому символу пробела, эквивалентному \t\n\r\f. |
\S | Соответствует любому непустому символу |
\d | Соответствует любому числу, эквивалентному 0–9. |
\D | Соответствует любому нечисловому значению |
\A | начало строки совпадения |
\Z | Соответствует концу строки. При наличии новой строки сопоставляется только конец строки перед новой строкой. |
\z | Конец строки соответствия |
\G | Сопоставьте позицию, в которой было завершено последнее совпадение. |
\b | Соответствует границе слова, которая представляет собой положение между словом и пробелом. Например, «er\b» соответствует «er» в слове «никогда», но не в слове «глагол». |
\B | Сопоставьте несловные границы. 'er\B' соответствует 'er' в слове "глагол", но не в слове "никогда". |
\n, \t и т. д. | Соответствует символу новой строки. Соответствует символу табуляции и т. д. |
\1...\9 | Сопоставьте содержимое n-й группы. |
\10 | Соответствует содержимому n-й группы, если оно соответствует. В противном случае это относится к выражению восьмеричного кода символа. |
Примечание: re в таблице относится к выражению, а не к буквальным двум буквам re.
Модификатор регулярного выражения – необязательные флаги
Регулярные выражения могут содержать некоторые необязательные модификаторы флагов для управления сопоставляемыми шаблонами. Модификатор указывается как необязательный флаг. Несколько флагов можно указать с помощью побитового ИЛИ(|). Например, re.I | re.M установлены флаги I и M:
модификатор | описывать |
---|---|
re.I | Сделать совпадение нечувствительным к регистру |
re.L | Выполнять сопоставление с учетом локали |
re.M | Многострочное сопоставление влияет на ^ и $ |
re.S | Сделать . соответствовать всем символам, включая символы новой строки. |
re.U | Анализ символов в соответствии с набором символов Юникода. Этот флаг влияет на \w, \W, \b, \B. |
re.X | Этот флаг упрощает понимание регулярных выражений, предоставляя вам более гибкий формат. |
объект регулярного выражения
re.RegexObject
re.compile() возвращает объект RegexObject.
re.MatchObject
group() возвращает строку, соответствующую RE.
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.
Пример и вывод:
Функция компиляции используется для компиляции регулярных выражений и создания объекта регулярного выражения (шаблона), который используется функцией 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)
Пример и вывод:
Метод разделения разбивает строку в соответствии с совпадающими подстроками и возвращает список. Форма его использования следующая:
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 до номера группы, содержащегося в . |
Пример и вывод:
Модуль re Python предоставляет 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 | Соответствует «питону». |
Пример | описывать |
---|---|
Ppython | Соответствует «Python» или «python». |
rubye | Соответствует «рубину» или «рубе». |
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. Найдите «Пекин Хонге» в полях поиска Sogou и Bing соответственно.
2. Нажмите «Запрос» соответственно и просмотрите результаты запроса.
3. Получите результаты запроса отдельно
4. Извлеките числа из результата и сохраните их в переменных.
5. Сравните размер двух чисел
# coding=utf-8🔥
# 1. Сначала установите кодировку UTF-8, которая поддерживает китайский и английский языки, как указано выше, обычно они располагаются в первой строке.
# 2. Примечания: включая время создания записи, автора и название проекта.
'''
Created on 2024-04-10
@author: Пекин-Хонге
Публичный аккаунт: Beijing Hongge (поиск WeChat: Beijing Hongge, фокус на Брат Хун, разблокируй больше тестовых вещей заранее)
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")
# Получить значение поля «Инструмент поиска Согоу нашел около xxxx результатов, связанных с прибытием для вас"
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)
# позиция Bing имеет результаты 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)
# Сравнение результатов поиска Sogou и Bing
if (a_N > b_N):
print("Сого потрясающий, Сого сильный!!!")
else:
print("Bing потрясающий, Bing могучий!!!");
page.wait_for_timeout(20000)
page.close()
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
1. Запустите код, щелкните правой кнопкой мыши «Выполнить тест», и вы увидите вывод консоли, как показано ниже:
2. Действия браузера на компьютере после запуска кода. Как показано ниже:
Хорошо, брат Хун представил здесь работу со строками. На самом деле, у этих двух методов есть свои преимущества. Если один из них не подходит или сложен в использовании, вы можете попробовать другой метод, возможно, он окажется успешным. Не попадайте в неприятности и идите до конца. Еще есть синтаксис регулярных выражений. Проверьте сами и посмотрите. Освоить его можно почти за полчаса. Потом надо уделить внимание практике, иначе после еды забудешь.