最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?正則表達(dá)式?re.findall()全面解析

 更新時(shí)間:2025年09月16日 11:09:59   作者:doris8204  
本文詳解Python?re.findall()方法,用于提取字符串中所有正則匹配項(xiàng),重點(diǎn)涵蓋分組處理、flags參數(shù)(如忽略大小寫(xiě)、多行模式、Unicode支持等)及應(yīng)用場(chǎng)景,如提取郵件、URL、日志信息等,并提醒注意性能與返回值格式差異,感興趣的朋友跟隨小編一起看看吧

re.findall() 是 Python re 模塊中用于查找字符串中所有匹配正則表達(dá)式模式的子串的方法。與 re.search() 只返回第一個(gè)匹配項(xiàng)不同,findall() 會(huì)返回所有匹配項(xiàng)。

基本語(yǔ)法

re.findall(pattern, string, flags=0)

參數(shù)說(shuō)明:

  • pattern: 正則表達(dá)式模式
  • string: 要搜索的字符串
  • flags: 可選標(biāo)志,如 re.IGNORECASEre.MULTILINE

返回值:

  • 如果模式中有分組,返回分組元組的列表
  • 如果模式中沒(méi)有分組,返回所有匹配子串的列表
  • 如果沒(méi)有找到匹配,返回空列表

1. 基本查找用法

示例1:查找所有數(shù)字

import re
text = "There are 3 apples and 5 oranges"
numbers = re.findall(r'\d+', text)
print(numbers)  # 輸出: ['3', '5']

示例2:查找所有單詞

text = "Hello world! Python is awesome."
words = re.findall(r'\w+', text)
print(words)  # 輸出: ['Hello', 'world', 'Python', 'is', 'awesome']

2. 使用分組時(shí)的行為

示例3:無(wú)分組情況

text = "John: 30, Jane: 25, Bob: 42"
ages = re.findall(r': \d+', text)
print(ages)  # 輸出: [': 30', ': 25', ': 42']

示例4:有分組情況(返回分組內(nèi)容)

text = "John: 30, Jane: 25, Bob: 42"
ages = re.findall(r': (\d+)', text)
print(ages)  # 輸出: ['30', '25', '42']

示例5:多個(gè)分組情況

text = "John: 30, Jane: 25, Bob: 42"
info = re.findall(r'(\w+): (\d+)', text)
print(info)  # 輸出: [('John', '30'), ('Jane', '25'), ('Bob', '42')]

3. 使用正則表達(dá)式高級(jí)特性

示例6:非貪婪匹配

html = "<div>content1</div><div>content2</div>"
contents = re.findall(r'<div>(.*?)</div>', html)
print(contents)  # 輸出: ['content1', 'content2']

示例7:使用字符類(lèi)

text = "Colors: red, green, BLUE, Yellow"
colors = re.findall(r'[a-zA-Z]+', text)
print(colors)  # 輸出: ['Colors', 'red', 'green', 'BLUE', 'Yellow']

示例8:使用邊界匹配

text = "cat category concatenate"
words = re.findall(r'\bcat\b', text)
print(words)  # 輸出: ['cat']

4. 使用標(biāo)志(flags)

示例9:忽略大小寫(xiě)

text = "Apple orange BANANA Grape"
fruits = re.findall(r'[a-z]+', text, re.IGNORECASE)
print(fruits)  # 輸出: ['Apple', 'orange', 'BANANA', 'Grape']

示例10:多行模式

text = """First line
Second line
Third line"""
lines = re.findall(r'^\w+', text, re.MULTILINE)
print(lines)  # 輸出: ['First', 'Second', 'Third']

5. 實(shí)際應(yīng)用場(chǎng)景

示例11:提取電子郵件地址

text = "Contact us at info@example.com or support@test.org"
emails = re.findall(r'[\w\.-]+@[\w\.-]+', text)
print(emails)  # 輸出: ['info@example.com', 'support@test.org']

示例12:提取URL鏈接

text = "Visit https://www.example.com or http://test.org"
urls = re.findall(r'https?://[^\s/$.?#].[^\s]*', text)
print(urls)  # 輸出: ['https://www.example.com', 'http://test.org']

示例13:解析日志文件

log = """
2023-04-15 10:00:00 INFO System started
2023-04-15 10:01:23 ERROR Database connection failed
2023-04-15 10:02:45 WARNING Disk space low
"""
errors = re.findall(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} ERROR (.+)', log)
print(errors)  # 輸出: ['Database connection failed']

示例14:提取HTML標(biāo)簽內(nèi)容

html = "<h1>Title</h1><p>Paragraph 1</p><p>Paragraph 2</p>"
paragraphs = re.findall(r'<p>(.*?)</p>', html)
print(paragraphs)  # 輸出: ['Paragraph 1', 'Paragraph 2']

示例15:提取電話(huà)號(hào)碼

text = "Call 123-456-7890 or 987.654.3210"
phones = re.findall(r'\d{3}[-.]\d{3}[-.]\d{4}', text)
print(phones)  # 輸出: ['123-456-7890', '987.654.3210']

示例16:提取貨幣金額

text = "Prices: $12.99, €9.99, ¥1000"
prices = re.findall(r'[\$€¥]\d+\.?\d*', text)
print(prices)  # 輸出: ['$12.99', '€9.99', '¥1000']

示例17:提取日期

text = "Dates: 2023-04-15, 15/04/2023, 04.15.2023"
dates = re.findall(r'\d{4}[-/.]\d{2}[-/.]\d{2}|\d{2}[-/.]\d{2}[-/.]\d{4}', text)
print(dates)  # 輸出: ['2023-04-15', '15/04/2023', '04.15.2023']

6. 高級(jí)技巧

示例18:使用命名分組

text = "User: john_doe, Age: 30; User: jane_smith, Age: 25"
users = re.findall(r'User: (?P<name>\w+), Age: (?P<age>\d+)', text)
print(users)  # 輸出: [('john_doe', '30'), ('jane_smith', '25')]

示例19:復(fù)雜模式匹配

text = "Coordinates: (12.345, -67.890), (0, 42.123)"
coords = re.findall(r'\(([^,]+),\s*([^)]+)\)', text)
print(coords)  # 輸出: [('12.345', '-67.890'), ('0', '42.123')]

示例20:使用正向預(yù)查

text = "apple orange banana grape"
fruits_before_banana = re.findall(r'\w+(?=\sbanana)', text)
print(fruits_before_banana)  # 輸出: ['orange']

7. 注意事項(xiàng)

  1. re.findall() 返回的是字符串列表或元組列表,不是匹配對(duì)象
  2. 當(dāng)模式中有分組時(shí),只返回分組內(nèi)容,不是整個(gè)匹配
  3. 對(duì)于大文本,考慮使用 re.finditer() 節(jié)省內(nèi)存
  4. 復(fù)雜的正則表達(dá)式可能會(huì)影響性能
  5. 處理HTML/XML等結(jié)構(gòu)化數(shù)據(jù)時(shí),最好使用專(zhuān)門(mén)的解析器

示例21:與re.finditer()對(duì)比

text = "Error 404, Error 500, Warning 302"
# 使用 findall
codes = re.findall(r'Error (\d+)', text)
print(codes)  # 輸出: ['404', '500']
# 使用 finditer
for match in re.finditer(r'Error (\d+)', text):
    print(f"Found at {match.start()}-{match.end()}: {match.group(1)}")
# 輸出:
# Found at 0-8: 404
# Found at 10-18: 500

8. 性能優(yōu)化建議

預(yù)編譯常用正則表達(dá)式:

pattern = re.compile(r'\d+')
numbers = pattern.findall(text)

盡量使用具體模式而非寬泛模式:

# 不好的寫(xiě)法
re.findall(r'.*:\s*(.*)', text)
# 更好的寫(xiě)法
re.findall(r'\w+:\s*(\w+)', text)

避免過(guò)度使用回溯:

# 可能導(dǎo)致性能問(wèn)題的寫(xiě)法
re.findall(r'(a+)+$', text)

Pythonre.findall()方法中的 flags 參數(shù)詳解

re.findall() 方法的 flags 參數(shù)可以修改正則表達(dá)式的匹配行為,使其更靈活地適應(yīng)不同的文本處理需求。下面我將詳細(xì)介紹各種 flag 的用法和實(shí)際應(yīng)用場(chǎng)景。

1. 常用 flags 概覽

標(biāo)志常量簡(jiǎn)寫(xiě)描述
re.IGNORECASEre.I忽略大小寫(xiě)
re.MULTILINEre.M多行模式,影響 ^$
re.DOTALLre.S使 . 匹配包括換行符在內(nèi)的所有字符
re.VERBOSEre.X允許編寫(xiě)更易讀的正則表達(dá)式
re.ASCIIre.A使 \w, \W, \b, \B, \d, \D, \s, \S 只匹配 ASCII 字符
re.LOCALEre.L使 \w, \W, \b, \B 依賴(lài)當(dāng)前區(qū)域設(shè)置
re.UNICODEre.U使 \w, \W, \b, \B, \d, \D, \s, \S 匹配 Unicode 字符

2. 各 flag 詳細(xì)說(shuō)明及示例

2.1re.IGNORECASE(re.I) - 忽略大小寫(xiě)

作用:使匹配對(duì)大小寫(xiě)不敏感

示例

import re
text = "Apple banana ORANGE Grape"
# 不使用 IGNORECASE
result = re.findall(r'apple', text)
print(result)  # []
# 使用 IGNORECASE
result = re.findall(r'apple', text, re.IGNORECASE)
print(result)  # ['Apple']
# 匹配所有水果名(忽略大小寫(xiě))
fruits = re.findall(r'[a-z]+', text, re.I)
print(fruits)  # ['Apple', 'banana', 'ORANGE', 'Grape']

2.2re.MULTILINE(re.M) - 多行模式

作用:改變 ^$ 的行為,使它們分別匹配每一行的開(kāi)頭和結(jié)尾

示例

text = """First line
Second line
Third line"""
# 不使用 MULTILINE
result = re.findall(r'^\w+', text)
print(result)  # ['First']
# 使用 MULTILINE
result = re.findall(r'^\w+', text, re.MULTILINE)
print(result)  # ['First', 'Second', 'Third']
# 匹配每行末尾的單詞
result = re.findall(r'\w+$', text, re.M)
print(result)  # ['line', 'line', 'line']

2.3re.DOTALL(re.S) - 點(diǎn)號(hào)匹配所有模式

作用:使 . 匹配包括換行符在內(nèi)的所有字符

示例

text = """Start
Middle
End"""
# 不使用 DOTALL
result = re.findall(r'Start.*End', text)
print(result)  # []
# 使用 DOTALL
result = re.findall(r'Start.*End', text, re.DOTALL)
print(result)  # ['Start\nMiddle\nEnd']
# 提取多行注釋內(nèi)容
html = """<!-- 
這是多行
HTML注釋 
-->"""
comment = re.findall(r'<!--(.*?)-->', html, re.DOTALL)
print(comment)  # [' \n這是多行\(zhòng)nHTML注釋 \n']

2.4re.VERBOSE(re.X) - 詳細(xì)模式

作用:允許在正則表達(dá)式中添加空白和注釋?zhuān)蛊涓鬃x

示例

# 復(fù)雜的電話(huà)號(hào)碼正則表達(dá)式
phone_re = re.compile(r'''
    ^(\+\d{1,3})?       # 國(guó)際區(qū)號(hào)
    [-\s]?              # 分隔符
    (\d{3})             # 前3位
    [-\s]?              # 分隔符
    (\d{3,4})           # 中間3或4位
    [-\s]?              # 分隔符
    (\d{4})             # 最后4位
    $''', re.VERBOSE)
text = "Phone numbers: +86-138-1234-5678, 010-87654321"
numbers = phone_re.findall(text)
print(numbers)  # [('+86', '138', '1234', '5678'), ('', '010', '8765', '4321')]

2.5re.ASCII(re.A) - ASCII 模式

作用:使 \w, \W, \b, \B, \d, \D, \s, \S 只匹配 ASCII 字符

示例

text = "Python3 中文 Espa?ol café"
# 默認(rèn)模式(Unicode)
result = re.findall(r'\w+', text)
print(result)  # ['Python3', '中文', 'Espa?ol', 'café']
# ASCII 模式
result = re.findall(r'\w+', text, re.ASCII)
print(result)  # ['Python3', 'Espa', 'ol', 'caf']

2.6re.UNICODE(re.U) - Unicode 模式

作用:使 \w, \W, \b, \B, \d, \D, \s, \S 匹配 Unicode 字符(Python 3 默認(rèn))

示例

text = "Русский 中文 ελληνικ?"
# 默認(rèn)就是 UNICODE 模式
result = re.findall(r'\w+', text)
print(result)  # ['Русский', '中文', 'ελληνικ?']
# 顯式指定 UNICODE
result = re.findall(r'\w+', text, re.UNICODE)
print(result)  # ['Русский', '中文', 'ελληνικ?']

2.7re.LOCALE(re.L) - 區(qū)域設(shè)置模式

作用:使 \w, \W, \b, \B 依賴(lài)當(dāng)前區(qū)域設(shè)置(不推薦使用)

示例

import locale
# 設(shè)置區(qū)域?yàn)榈抡Z(yǔ)
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
text = "stra?e café"
result = re.findall(r'\w+', text, re.LOCALE)
print(result)  # ['stra?e', 'café']

3. 組合使用多個(gè) flags

可以通過(guò)按位或 (|) 操作符組合多個(gè) flags

示例

text = """Name: John
AGE: 30
name: Jane
age: 25"""
# 同時(shí)使用 IGNORECASE 和 MULTILINE
results = re.findall(r'^name:\s*(\w+)', text, re.I | re.M)
print(results)  # ['John', 'Jane']
# 解析多行配置項(xiàng)
config = """[Server]
host = example.com
port = 8080
timeout = 30"""
settings = re.findall(
    r'^(\w+)\s*=\s*(.*)$', 
    config, 
    re.MULTILINE | re.VERBOSE
)
print(settings)  # [('host', 'example.com'), ('port', '8080'), ('timeout', '30')]

4. 實(shí)際應(yīng)用場(chǎng)景

4.1 解析日志文件(多行模式)

log = """2023-04-15 10:00:00 [INFO] System started
2023-04-15 10:01:23 [ERROR] Database connection failed
2023-04-15 10:02:45 [WARN] Disk space low"""
# 提取所有錯(cuò)誤日志(帶時(shí)間戳)
errors = re.findall(
    r'^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \[ERROR\] (.*)$',
    log,
    re.MULTILINE
)
print(errors)  # [('2023-04-15 10:01:23', 'Database connection failed')]

4.2 提取HTML內(nèi)容(點(diǎn)號(hào)匹配所有)

html = """<div>
    <p>First paragraph</p>
    <p>Second paragraph</p>
</div>"""
# 提取所有段落內(nèi)容
paragraphs = re.findall(
    r'<p>(.*?)</p>',
    html,
    re.DOTALL  # 使 . 匹配換行符
)
print(paragraphs)  # ['First paragraph', 'Second paragraph']

4.3 多語(yǔ)言文本處理(Unicode模式)

text = "English: hello, 中文: 你好, Fran?ais: bonjour"
# 提取所有非ASCII單詞
words = re.findall(
    r'[^\x00-\x7F]+',  # 匹配非ASCII字符
    text,
    re.UNICODE
)
print(words)  # ['你好', 'bonjour']

4.4 復(fù)雜模式匹配(詳細(xì)模式)

# 匹配各種格式的日期
date_re = re.compile(r'''
    ^
    (?:20\d{2}|19\d{2})  # 年份 1900-2099
    [-/.]                # 分隔符
    (?:0[1-9]|1[0-2])    # 月份 01-12
    [-/.]                # 分隔符
    (?:0[1-9]|[12][0-9]|3[01])  # 日 01-31
    $''', re.VERBOSE)
dates = ["2023-04-15", "1999/12/31", "2000.01.01"]
valid_dates = [d for d in dates if date_re.search(d)]
print(valid_dates)  # ['2023-04-15', '1999/12/31', '2000.01.01']

5. 注意事項(xiàng)

  1. flag 的作用范圍:flags 會(huì)影響整個(gè)正則表達(dá)式的行為
  2. flag 的組合:多個(gè) flags 可以組合使用,但要注意它們之間的交互
  3. 性能考慮:某些 flags(如 re.UNICODE)可能會(huì)影響性能
  4. 預(yù)編譯正則表達(dá)式:頻繁使用的正則表達(dá)式應(yīng)該先編譯再使用
    pattern = re.compile(r'your_pattern', flags=re.I | re.M)
    results = pattern.findall(text)
  5. Python 3 的默認(rèn)行為:在 Python 3 中,re.UNICODE 是默認(rèn)啟用的

通過(guò)合理使用這些 flags,你可以編寫(xiě)出更強(qiáng)大、更靈活的正則表達(dá)式,適應(yīng)各種復(fù)雜的文本處理需求。

到此這篇關(guān)于Python 正則表達(dá)式 re.findall()全面解析的文章就介紹到這了,更多相關(guān)Python 正則表達(dá)式 re.findall()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Cython提升Python性能的方法步驟

    使用Cython提升Python性能的方法步驟

    Cython是Python的一種擴(kuò)展,允許Python代碼調(diào)用C庫(kù),本文主要介紹了使用Cython提升Python的性能的方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • Python中Django框架下的staticfiles使用簡(jiǎn)介

    Python中Django框架下的staticfiles使用簡(jiǎn)介

    這篇文章主要介紹了Python中Django框架下的staticfiles使用簡(jiǎn)介,staticfiles是一個(gè)幫助Django管理靜態(tài)資源的工具,需要的朋友可以參考下
    2015-05-05
  • Tensorflow 自定義loss的情況下初始化部分變量方式

    Tensorflow 自定義loss的情況下初始化部分變量方式

    今天小編就為大家分享一篇Tensorflow 自定義loss的情況下初始化部分變量方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Python實(shí)現(xiàn)的刪除重復(fù)文件或圖片功能示例【去重】

    Python實(shí)現(xiàn)的刪除重復(fù)文件或圖片功能示例【去重】

    這篇文章主要介紹了Python實(shí)現(xiàn)的刪除重復(fù)文件或圖片功能,結(jié)合實(shí)例形式分析了Python基于os與hashlib模塊針對(duì)文件的讀取、hash計(jì)算及重復(fù)性判定等相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • python使用tcp實(shí)現(xiàn)局域網(wǎng)內(nèi)文件傳輸

    python使用tcp實(shí)現(xiàn)局域網(wǎng)內(nèi)文件傳輸

    這篇文章主要介紹了python使用tcp實(shí)現(xiàn)局域網(wǎng)內(nèi)文件傳輸,文件包括文本,圖片,視頻等,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • python展開(kāi)嵌套列表的多種方法

    python展開(kāi)嵌套列表的多種方法

    本文主要介紹了python展開(kāi)嵌套列表的多種方法,包括for循環(huán)、列表推導(dǎo)式和sum函數(shù)三種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Opencv+Python實(shí)現(xiàn)圖像運(yùn)動(dòng)模糊和高斯模糊的示例

    Opencv+Python實(shí)現(xiàn)圖像運(yùn)動(dòng)模糊和高斯模糊的示例

    今天小編就為大家分享一篇關(guān)于Opencv+Python實(shí)現(xiàn)圖像運(yùn)動(dòng)模糊和高斯模糊的示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • 總結(jié)Python變量的相關(guān)知識(shí)

    總結(jié)Python變量的相關(guān)知識(shí)

    今天給大家?guī)?lái)的是關(guān)于Python基礎(chǔ)的相關(guān)知識(shí),文章圍繞著Python變量的相關(guān)知識(shí)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • PyCharm內(nèi)存占用過(guò)高問(wèn)題分析與優(yōu)化指南

    PyCharm內(nèi)存占用過(guò)高問(wèn)題分析與優(yōu)化指南

    PyCharm作為Python開(kāi)發(fā)領(lǐng)域最受歡迎的集成開(kāi)發(fā)環(huán)境(IDE)之一,以其強(qiáng)大的功能和智能化的開(kāi)發(fā)體驗(yàn)贏得了全球開(kāi)發(fā)者的青睞,然而,許多用戶(hù)在使用過(guò)程中都遇到了一個(gè)共同的問(wèn)題PyCharm的內(nèi)存占用率異常高企,所以本文介紹了PyCharm內(nèi)存占用過(guò)高問(wèn)題分析與優(yōu)化指南
    2025-05-05
  • Python?數(shù)據(jù)可視化神器Pyecharts繪制圖像練習(xí)

    Python?數(shù)據(jù)可視化神器Pyecharts繪制圖像練習(xí)

    這篇文章主要介紹了Python?數(shù)據(jù)可視化神器Pyecharts繪制圖像練習(xí),繪制的圖形有柱狀圖、餅狀圖、箱型圖、折線(xiàn)圖、雷達(dá)圖等多種圖像,需要的小伙伴可以參考一下
    2022-02-02

最新評(píng)論

柳河县| 阳谷县| 原平市| 巴南区| 和田县| 仁怀市| 安泽县| 黄山市| 马尔康县| 冷水江市| 浪卡子县| 曲水县| 丹东市| 长葛市| 资阳市| 德州市| 莱阳市| 鹤山市| 曲水县| 乐平市| 乃东县| 南京市| 安国市| 平果县| 武宣县| 高碑店市| 汉中市| 沐川县| 郧西县| 福州市| 长丰县| 报价| 共和县| 新巴尔虎右旗| 正镶白旗| 济阳县| 自贡市| 无棣县| 宣汉县| 大兴区| 阳东县|