在Pandas中,extract()和extractall()都是用来从字符串中提取模式匹配的内容的方法¹³⁴。它们都可以使用正则表达式来进行模式匹配¹³⁴。不过,它们在处理匹配结果的方式上有所不同¹²³⁴。
extract(): 这个方法只提取第一个匹配的内容¹³⁴。如果一个字符串中有多个匹配的内容,extract()只会返回第一个¹³⁴。extractall(): 这个方法提取所有匹配的内容¹³⁴。对于每一个字符串,extractall()会返回一个DataFrame,其中每一行对应一个匹配的结果²。这个方法会创建一个名为"match"的新索引级别,用来标识匹配的编号²。
例如,假设我们有一个DataFrame df,其中有一列名为col,包含两个字符串'ABC'和'ADAE'²:
import pandas as pd
df = pd.DataFrame({'col': ['ABC', 'ADAE']})我们可以使用extract()和extractall()来匹配'A'和后面的字母²:
# 使用extract()
print(df['col'].str.extract('(A.)'))
# 使用extractall()
print(df['col'].str.extractall('(A.)'))extract()的输出为²:
0
0 AB
1 ADextractall()的输出为²:
0
match
0 0 AB
1 0 AD
1 AE可以看到,extractall()返回了所有的匹配结果,而extract()只返回了第一个匹配结果²。希望这个信息对你有所帮助!
在Pandas中,你可以使用str.extractall()方法来提取字符串中所有匹配正则表达式的结果¹²。这个方法会返回一个DataFrame,其中每一行对应原始Series中的一个元素,每一列对应一个匹配的结果¹²。
下面是一个例子,展示了如何在Pandas的Series对象上应用你的正则表达式和过滤规则:
import pandas as pd
import re
# 创建一个Series
s = pd.Series(["AA5052(HF123AB)-5.0-O-H14-(我是-猪猪)", "BB6061(HF456CD)-6.0-P-H24-(你是-猪猪)"])
# 定义匹配规则
pattern = r"\b[A-Za-z0-9]+\b"
# 使用str.extractall()方法提取所有匹配的结果
matches = s.str.extractall(pattern)
# 过滤掉 "H" 后面直接跟数字的子串,纯字母的子串,以及四位数以下的纯数字
matches = matches[~matches[0].str.match(r"H\d+") & matches[0].str.contains(r"\d") & ~matches[0].str.match(r"\d{1,3}\b")]
print(matches)在这个例子中,str.extractall()方法首先找到所有匹配正则表达式的子串,然后使用Pandas的布尔索引来过滤掉不符合要求的子串¹²。希望这个信息对你有所帮助!
'# 正则表达式匹配 (""或任意非数字字符)("0"或"") + today.month + "月" + ("0"或"") + today.day + "日"
# (?<![0-9]) 与 \D 与 \d的区别
UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.
df_today = df_dir[df_dir.iloc[:, 0].str.contains(pattern, regex=True)]import datetime
today = datetime.date.today()
# 正则表达式匹配 (""或任意非数字字符)("0"或"") + today.month + "月" + ("0"或"") + today.day + "日"
pattern = r"(\D?0?{})月(0?{})日".format(today.month, today.day)这是一个警告,表示你正在使用的正则表达式包含匹配组。在Pandas的str.contains()函数中,正则表达式的匹配组不会被单独提取出来。如果你想要获取这些匹配组的内容,你应该使用str.extract()函数,而不是str.contains()。
这是一个例子来说明如何使用str.extract():
df_today = df_dir[df_dir.iloc[:, 0].str.extract(pattern, expand=False).notna()]在这个例子中,str.extract()函数会返回一个DataFrame,其中包含了匹配到的组。expand=False参数表示如果只有一个匹配组,那么返回一个Series而不是DataFrame。notna()函数用于选择非空的行,即那些匹配到正则表达式的行。
请注意,如果你的正则表达式有多个匹配组,那么str.extract()会返回一个DataFrame,每一列对应一个匹配组。在这种情况下,你可能需要使用any(axis=1)来选择至少匹配到一个组的行。
pandas contains 与 extract 的区别 正如 re.search 与 findall 的区别
pandas startwith 正如 re.match 从头匹配
匹配尾巴 pandas endwith 而re则使用正则表达式符号
在正则表达式中,如果你想要匹配字符串的尾部,你可以使用$符号⁵⁶。$符号表示匹配行或字符串的结束⁵⁶。例如,如果你想要匹配所有以.txt结尾的字符串,你可以使用正则表达式.*\.txt$²。
这里是一个例子²:
import re
# 匹配以数字结尾的数据
match_obj = re.match(".*\\d$", "hello5")
if match_obj:
# 获取匹配结果
print(match_obj.group())
else:
print("匹配失败")在这个例子中,.*\\d$是一个正则表达式,它匹配所有以数字结尾的字符串²。如果字符串"hello5"以数字结尾,match_obj.group()将返回整个匹配的字符串²。
希望这个解释对你有所帮助!源: 与必应的对话, 2023/12/2
(1) 正则表达式 – 语法 | 菜鸟教程. https://www.runoob.com/regexp/regexp-syntax.html.
(2) 正则表达式结尾匹配|极客教程. https://geek-docs.com/regexp/regexp-tutorials/63_the_end_of_the_regular_expression_matches.html.
(3) [正则表达式] 匹配开头和结尾 - CSDN博客. https://blog.csdn.net/weixin_42482896/article/details/108086467.
(4) 正则表达式如何获得最后一个匹配? - 知乎. https://www.zhihu.com/question/23258550.
(5) 正则表达式 – 语法 | 菜鸟教程. https://bing.com/search?q=正则表达式+尾部.
(6) 如何在Python中使用正则表达式匹配字符串末尾?|极客教程. https://geek-docs.com/python/python-ask-answer/t_how-to-match-at-the-end-of-string-in-python-using-regular-expression.html.
(7) undefined. http://www.w3.org/1999/xhtml.
















