Biểu thức chính quy từ mô-đun re có hỗ trợ ranh giới từ (\ b) không?


100

Trong khi cố gắng tìm hiểu thêm một chút về cụm từ thông dụng, một hướng dẫn đã gợi ý rằng bạn có thể sử dụng \bđể so khớp với ranh giới từ. Tuy nhiên, đoạn mã sau trong trình thông dịch Python không hoạt động như mong đợi:

>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)

Nó đáng lẽ phải là một đối tượng khớp nếu bất cứ thứ gì được khớp, nhưng nó là như vậy None.

Có phải \bbiểu thức không được hỗ trợ trong Python hay tôi đang sử dụng nó sai?


31
Điều này sẽ hoạt động:re.search(r"\btwo\b", x)
Bolo

5
Tại sao bạn không sử dụng chuỗi "thô"? r"\btwo\b"?
S.Lott

3
Mọi người thường nhầm lẫn về \b.
tchrist

Python thì có, bạn chỉ cần chuỗi thô r'\b'để ký tự được thoát. (hoặc nếu không thì thoát khỏi nó \\b, đó là yukky)
smci

Câu trả lời:


85

Sao bạn không thử

word = 'two'
re.compile(r'\b%s\b' % word, re.I)

Đầu ra:

>>> word = 'two'
>>> k = re.compile(r'\b%s\b' % word, re.I)
>>> x = 'one two three'
>>> y = k.search( x)
>>> y
<_sre.SRE_Match object at 0x100418850>

Cũng quên đề cập, bạn nên sử dụng chuỗi thô trong mã của mình

>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>> 

Thật thú vị, cảm ơn vì ví dụ làm việc. Bạn có hiểu biết gì về lý do tại sao phương pháp tôi chọn không hoạt động không? Hai cách tiếp cận phải giống nhau, ngoại trừ cách tiếp cận của bạn, bạn chỉ biên dịch một lần.
DC

1
@darren: Hãy xem ví dụ cuối cùng của tôi để cải thiện những gì bạn đã làm. Tôi đã cung cấp chuỗi thô để tìm kiếm.
pyfunc,

1
ahh sau gợi ý của bạn và Bolo, đó là vì tôi không sử dụng chuỗi thô. Cảm ơn!
DC

9
-1: Lùi lại. Các chuỗi thô phải được đặt trước. Việc xây dựng một biểu thức re với %sự thay thế chuỗi là một tiếp tuyến xấu, không liên quan đến câu hỏi cụ thể này.
S.Lott

2
Câu trả lời không hay. Mã hoạt động, nhưng không có bất kỳ lời giải thích nào.
Aran-Fey

88

Điều này sẽ hoạt động: re.search(r"\btwo\b", x)

Khi bạn viết "\b" bằng Python, nó là một nhân vật duy nhất: "\x08". Hoặc thoát khỏi dấu gạch chéo ngược như thế này:

"\\b"

hoặc viết một chuỗi thô như thế này:

r"\b"

4
Điều này thực sự giúp ích cho tôi ... Tôi đang đấu tranh với một biểu thức chính quy giống pyspark và không thể tìm ra lý do tại sao \ b (ranh giới từ) không hoạt động. Cảm ơn
jb1t

17

Chỉ để giải thích rõ ràng tại sao re.search("\btwo\b", x) không hoạt động, đó là bởi vì \btrong một chuỗi Python là viết tắt của một ký tự xóa lùi.

print("foo\bbar")
fobar

Vì vậy, mẫu "\btwo\b"đang tìm kiếm một backspace, theo sau twolà một backspace khác, mà chuỗi mà bạn đang tìm kiếm trong ( x = 'one two three') không có.

Để cho phép re.search(hoặc compile) diễn giải chuỗi \bdưới dạng ranh giới từ, hãy thoát khỏi dấu gạch chéo ngược ( "\\btwo\\b") hoặc sử dụng chuỗi thô để tạo mẫu ( r"\btwo\b") của bạn .


10

Tài liệu Python

https://docs.python.org/2/library/re.html#regular-expression-syntax

\ b

Đối sánh với chuỗi trống, nhưng chỉ ở đầu hoặc cuối của một từ. Một từ được định nghĩa là một chuỗi các ký tự chữ và số hoặc gạch dưới, do đó, phần cuối của một từ được biểu thị bằng khoảng trắng hoặc một ký tự không phải chữ và số, không gạch dưới. Lưu ý rằng về mặt hình thức, \ b được định nghĩa là ranh giới giữa ký tự a \ w và a \ W (hoặc ngược lại) hoặc giữa \ w và đầu / cuối chuỗi, do đó, tập hợp chính xác các ký tự được coi là chữ và số phụ thuộc trên các giá trị của cờ UNICODE và LOCALE. Ví dụ: r '\ bfoo \ b' đối sánh với 'foo', 'foo.', '(Foo)', 'bar foo baz' nhưng không khớp với 'foobar' hoặc 'foo3'. Bên trong một dải ký tự, \ b đại diện cho ký tự xóa lùi, để tương thích với các ký tự chuỗi của Python.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.