[力扣每日一练]关于特定字符串的匹配
一:题目要求
表:products
+--------------+------------+
| Column Name | Type |
+--------------+------------+
| product_id | int |
| product_name | varchar |
| description | varchar |
+--------------+------------+
(product_id) 是这张表的唯一主键。
这张表的每一行表示一个产品的唯一 ID,名字和描述。
编写一个解决方案来找到所有描述中 包含一个有效序列号 模式的产品。一个有效序列号符合下述规则:
以 SN 字母开头(区分大小写)。
后面有恰好 4 位数字。
接着是一个短横(-), 短横后面还有另一组 4 位数字
序列号必须在描述内(可能不在描述的开头)
返回结果表以 product_id 升序 排序。
结果格式如下所示。
示例:
输入:
products 表:
+------------+--------------+------------------------------------------------------+
| product_id | product_name | description |
+------------+--------------+------------------------------------------------------+
| 1 | Widget A | This is a sample product with SN1234-5678 |
| 2 | Widget B | A product with serial SN9876-1234 in the description |
| 3 | Widget C | Product SN1234-56789 is available now |
| 4 | Widget D | No serial number here |
| 5 | Widget E | Check out SN4321-8765 in this description |
+------------+--------------+------------------------------------------------------+
输出:
+------------+--------------+------------------------------------------------------+
| product_id | product_name | description |
+------------+--------------+------------------------------------------------------+
| 1 | Widget A | This is a sample product with SN1234-5678 |
| 2 | Widget B | A product with serial SN9876-1234 in the description |
| 5 | Widget E | Check out SN4321-8765 in this description |
+------------+--------------+------------------------------------------------------+
解释:
产品 1:有效的序列号 SN1234-5678
产品 2:有效的序列号 SN9876-1234
产品 3:无效的序列号 SN1234-56789(短横后包含 5 位数字)
产品 4:描述中没有序列号
产品 5:有效的序列号 SN4321-8765
结果表以 product_id 升序排序。
可见序列号字符串在整个字符串中是独立出现的,它前后都有一个空字符,所以可以确定它作为一个特殊字符串前后是具有字符串边界的。
二:MySQL解决
首先确定该特殊字符串两边有字符串边界,所以应该确定好的初步格式是:'\\b正则表达式\\b'来确定好边界
根据题目表达,可以使用{n}表达特定字符出现了n次,所以结合起来就是 '\\bSN\\d{4}-\\d{4}\\b'
# Write your MySQL query statement below
SELECT *
FROM products
WHERE description regexp '\\bSN\\d{4}-\\d{4}\\b'
ORDER BY product_id ASC
三:PANDAS解法
python同理,但注意python的正则表达式反斜杠只需要一个就可以了,其他和MySQL一样
import pandas as pd
def find_valid_serial_products(products: pd.DataFrame) -> pd.DataFrame:
A=products['description'].str.contains(r'\bSN[0-9]{4}-[0-9]{4}\b')
return products[A]