簡短的回答是否定的,Python的正則表達式不能這樣\s
不會匹配\n
。
你可以做的是在匹配中檢測'\ n'並跳過這些。
def finditer_delimit_newlines(pattern, string, delimit_newlines=True):
matches = list(re.finditer(pattern, string))
if not matches:
return []
end = matches[-1].start()
newline_table = {-1: 0}
for i, m in enumerate(re.finditer(r'\n', string), 1):
offset = m.start()
newline_table[offset] = i
if offset > end:
break
for m in matches:
m_start = m.start()
m_end = m.end()
newline_offset = string.rfind('\n', 0, m_start)
newline_end = string.find('\n', m_end)
if delimit_newlines:
if ((newline_table[newline_offset] + 1) !=
(newline_table[newline_end]
if newline_end != -1 else len(newline_table))
):
continue
yield m
search = """A
B
A B"""
import re
for delimit_newlines in (False, True):
print("Test:", delimit_newlines)
for a in finditer_delimit_newlines(r'[A-Z]\s[A-Z]', search, delimit_newlines):
print(a)
該測試輸出
Test: False
<_sre.SRE_Match object; span=(0, 3), match='A\nB'>
<_sre.SRE_Match object; span=(5, 8), match='A B'>
Test: True
<_sre.SRE_Match object; span=(5, 8), match='A B'>
編輯,一場比賽可以捕捉尾隨換行符 定期空白的一部分,而它可以檢測到這一點,它可能是簡單的使用類似的方法如果換行符存在,則在有限範圍內重新匹配結果。
你問如何只匹配*水平空白*? –
我這麼認爲,是的。 – ideasman42
使用'[^ \ S \ r \ n]' –