2017-01-26 34 views
0

我曾在這名之後寫了一個PDF一個「/」不正確的輸出,由於正則表達式

例如:/約翰·亞當威爾紐曼

我想提取的名稱以「/」,

這是我寫的代碼是:

names=re.compile(r'((/)((\w)+(\s)))+')

然而,它產生的字符串「JOHN」只是名字和太2噸imes不是名字的其餘部分。

+1

請提供一個更完整的代碼示例,它將顯示如何使用正則表達式。我懷疑你使用了錯誤的組號,因爲你指定了太多無用的組。 –

+0

這是從pdf中提取名稱的唯一代碼! –

回答

0

您的+位於錯誤的位置;你的正則表達式,因爲它的立場,將要求/John /Adam /Will /Newman,尾隨空間。

r'((/)((\w)+(\s))+)'稍微好一點;它將接受/John Adam Will,尾隨空格;將不會採取Newman,因爲沒有什麼可以匹配\s

r'((/)(\w+(\s\w+)*))'與您發佈的內容相符。請注意,有必要重複其中一個匹配名稱的序列,因爲如果有N個詞,我們需要N-1個空格。

(作爲的Ondrej格羅弗在評論中說,你可能有太多不必要的捕獲括號,但我離開,僅僅因爲它傷害了什麼,但性能。)

+0

沒問題,如果我想在屏幕上打印整個名稱而不顯示所有組的結果,該怎麼辦?我試過這個, namelist = names.findall(text) pyperclip.copy(namelist) 但它給了我錯誤 –

0

我覺得你定義了太多的未命名的正則表達式組。我會做這樣的事情

import re 
s = '/John Adam Will Newman' 
name_regexp = re.compile(r'/(?P<name>(\w+\s*)+)') 
match_obj = name_regexp.match(s) # match object 
group_dict = match_obj.groupdict() # dict mapping {group name: value} 
name = group_dict['name'] 
  • (?P<name>...)啓動名爲組

  • (\w+\s*)是一個或多個匹配alphanum字符組,後面可能跟着一些空白

  • 匹配對象由.match(s)方法返回的方法具有方法groupdict(),其返回dict,其從組名映射到其內容

+0

我沒有完全理解代碼的這部分,match(s).groupdict()['名稱'] –

+0

我使它更加冗長,鋤頭這有助於。 –