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

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

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

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

基本語法

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

參數(shù)說明:

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

返回值:

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

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:無分組情況

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:使用字符類

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:忽略大小寫

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:提取電話號(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í),最好使用專門的解析器

示例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)

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

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

避免過度使用回溯:

# 可能導(dǎo)致性能問題的寫法
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)寫描述
re.IGNORECASEre.I忽略大小寫
re.MULTILINEre.M多行模式,影響 ^$
re.DOTALLre.S使 . 匹配包括換行符在內(nèi)的所有字符
re.VERBOSEre.X允許編寫更易讀的正則表達(dá)式
re.ASCIIre.A使 \w, \W, \b, \B, \d, \D, \s, \S 只匹配 ASCII 字符
re.LOCALEre.L使 \w, \W, \b, \B 依賴當(dāng)前區(qū)域設(shè)置
re.UNICODEre.U使 \w, \W, \b, \B, \d, \D, \s, \S 匹配 Unicode 字符

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

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

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

示例

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']
# 匹配所有水果名(忽略大小寫)
fruits = re.findall(r'[a-z]+', text, re.I)
print(fruits)  # ['Apple', 'banana', 'ORANGE', 'Grape']

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

作用:改變 ^$ 的行為,使它們分別匹配每一行的開頭和結(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á)式中添加空白和注釋,使其更易讀

示例

# 復(fù)雜的電話號(hào)碼正則表達(dá)式
phone_re = re.compile(r'''
    ^(\+\d{1,3})?       # 國際區(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 依賴當(dāng)前區(qū)域設(shè)置(不推薦使用)

示例

import locale
# 設(shè)置區(qū)域?yàn)榈抡Z
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

可以通過按位或 (|) 操作符組合多個(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 多語言文本處理(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)啟用的

通過合理使用這些 flags,你可以編寫出更強(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庫,本文主要介紹了使用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ì)大家有所幫助。一起跟隨小編過來看看吧
    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展開嵌套列表的多種方法

    python展開嵌套列表的多種方法

    本文主要介紹了python展開嵌套列表的多種方法,包括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)模糊和高斯模糊的示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 總結(jié)Python變量的相關(guān)知識(shí)

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

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

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

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

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

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

最新評(píng)論

阜城县| 宣汉县| 溧水县| 普兰店市| 陆丰市| 精河县| 改则县| 田东县| 新泰市| 桃源县| 汽车| 阳江市| 革吉县| 黔东| 台山市| 彭阳县| 神池县| 天镇县| 健康| 宁蒗| 社会| 类乌齐县| 唐山市| 独山县| 柘荣县| 高邑县| 隆子县| 连城县| 苗栗市| 缙云县| 巨鹿县| 随州市| 清原| 全州县| 四子王旗| 台中市| 常山县| 三亚市| 东乌| 巴林左旗| 沾化县|