2012-09-26 66 views
0

我想在Python中創建匹配一個#哈希標籤正則表達式的開始。我的主題標籤的定義是:可選匹配線

  • 這是一個#
  • 啓動時,它可以包含除[ ,\.]
  • 所有字符它可以在文本的任何地方

所以在工作中,本文

#This string cont#ains #four, and #only four #hashtags. 

的哈希這裏Thisfouronlyhashtags

我的問題是行的開頭可選檢查。

  • [ \.,]+不會做它,因爲它不會匹配可選的開始。因爲它匹配太多
  • [ \.,]?不會去做。

實施例與+

In []: re.findall('[ \.,]+#([^ \.,]+)', '#This string cont#ains #four, and #only four #hashtags.') 
Out[]: ['four', 'only', 'hashtags'] 

用實施例?

In []: re.findall('[ \.,]?#([^ \.,]+)', '#This string cont#ains #four, and #only four #hashtags.') 
Out[]: ['This', 'ains', 'four', 'only', 'hashtags'] 

如何才能選購匹配行的開始?

回答

3

這似乎工作:

>>> re.findall(r'\B#([^,\W]+)', '#This string cont#ains #four, and #only four #hashtags.') 
['This', 'four', 'only', 'hashtags'] 
  • \B:匹配空字符串,但只有當它是不是在一個單詞的開頭或結尾。這意味着r'py\B'匹配'python','py3','py2',但不是'py','py.''py!'\B只是\b相反,因此也受到的LOCALEUNICODE設置。
  • \W:當未指定LOCALEUNICODE標誌,匹配任何非字母數字字符;這相當於設置[^a-zA-Z0-9_]。通過LOCALE,它將匹配不在集合[0-9_]中的任何字符,並且不會將其定義爲當前語言環境的字母數字。如果UNICODE設置,這將匹配比歸爲在Unicode字符屬性數據庫非字母數字字符[0-9_]加字符以外的任何其他。
+0

感謝您的快速和正確的反應!像魅力一樣工作 – xeor

0

您正則表達式之前,你可以告訴你不想要的東西。

(?<!\w)(#[^ \.,]+) 

隨着負回顧後,你可以做到這一點

+0

這不符合字符串開頭的「#This」。 – pR0Ps

+0

更正,非常感謝 – Gabber