電話番号へのリンクPython
-
23-08-2019 - |
質問
仕事をしている作品のコード番電話番号へのリンク携帯電話-そうだったんでもかも汚れています。
import re
from string import digits
PHONE_RE = re.compile('([(]{0,1}[2-9]\d{2}[)]{0,1}[-_. ]{0,1}[2-9]\d{2}[-_. ]{0,1}\d{4})')
def numbers2links(s):
result = ""
last_match_index = 0
for match in PHONE_RE.finditer(s):
raw_number = match.group()
number = ''.join(d for d in raw_number if d in digits)
call = '<a href="tel:%s">%s</a>' % (number, raw_number)
result += s[last_match_index:match.start()] + call
last_match_index = match.end()
result += s[last_match_index:]
return result
>>> numbers2links("Ghost Busters at (555) 423-2368! How about this one: 555 456 7890! 555-456-7893 is where its at.")
'Ghost Busters at <a href="tel:5554232368">(555) 423-2368</a>! How about this one: <a href="tel:5554567890">555 456 7890</a>! <a href="tel:5554567893">555-456-7893</a> is where its at.'
直しとかは出来ないんですかっ再構築し、regexのは、正規表現方法を使用しているこのクリーナー?
更新
明らかに、私の質問ではないが正確であるかの正規表現を実現できます。なった場合は誰にもたコメントの方法substitingにリンク先の電話番号-直しとかは出来ないんですか使ってみました re.replace
ダイナミックレンジの広い代わりに文字列のhackeryいますか?
解決
素敵な一:きたいというこのバージョンは読みやすくするためには(そしteensy少します。キーものまでの利用 re.サブ.人々の営みから手に一致指数の...
import re
PHONE_RE = re.compile('([(]{0,1}[2-9]\d{2}[)]{0,1}[-_. ]{0,1}[2-9]\d{2}[-_. ]{0,1}\d{4})')
NON_NUMERIC = re.compile('\D')
def numbers2links(s):
def makelink(mo):
raw_number = mo.group()
number = NON_NUMERIC.sub("", raw_number)
return '<a href="tel:%s">%s</a>' % (number, raw_number)
return PHONE_RE.sub(makelink, s)
print numbers2links("Ghost Busters at (555) 423-2368! How about this one: 555 456 7890! 555-456-7893 is where its at.")
注:私は、私は気づかないくらいのスピードアップを図り前の作成の簡単な正規表現のように私が使っているものを使用している場合、って何千ものです。Reモジュールには何らかの内部キャッシュ-検索条件を絞り込読み、ソースとチェック。
また、交換の方法のひとつひとつ確認文字まで string.digits
他の re.sub()
いと思うから私の版は、読みやすくするためにいないのであしらったデザインとなって行ってより良いがい).
他のヒント
お正規表現のみを解析し、特定のフォーマットではない。ますマテリアルに限定するようにし、一国であります。
そうしないと、国際標準 ITU E.123 :"表記のための国内および国際電話番号、 e-mailアドレスやウェブアドレス"
最初に、確実に捕捉電話番号単一の正規表現は悪名が困難にする傾向が強い可能ですか。いうわけではありませんの国の定義は、"電話番号"と狭いので、米国でも、米国は、物事は複雑なように Wikipediaの記事が北アメリカの番号計画):
- A)国コード:オプションのプレフィックス("1"または"+1"または"001")
((00|\+)?1)?
- B)番プラン地域コード(警察庁の不正プログラム):スタートしません1、2桁できません9
[2-9][0-8][0-9]
- C)取引所コード(NXX):で始まる1日で終わり"11"、オプションの括弧内
\(?[2-9](00|[2-9]{2})\)?
- D)駅コード:四桁の数字はすべて0(か)
(?!0{4})\d{4}
- E)オプションの延長を可能
([x#-]\d+)?
- Sのパーツ番号に半角スペース区切ダッシュ-ドットの有無について
[. -]?
その基本的な正規表現のため、米国することはできない。
((00|\+)?1[. -]?)?\(?[2-9][0-8][0-9]\)?[. -]?[2-9](00|[2-9]{2})[. -]?(?!0{4})\d{4}([. -]?[x#-]\d+)?
| A |S | | B | S | C | S | D | S | E |
ことになるだけでは比較的自明な番プランの米国でもあるので確かな機微.だいたいので信頼して開発を行獣のためのすべての予定を入力す。
などがあるアパートを既存のregexな変化の機能:
交換{0,1}す。, [(】(,[)]。まもってみるべきではないだろうかだお[2-9]b e a dどをすることができるのでそのパターンがあるd{3}るd{4}の一部です。いいなっ率向上の誤検知.
なぜな再利用の他、例えば、 RegExpLib.com?
私の提案は覚えがありその他の国に、米国の他、かなりの数の電話;-)私たちを忘れない中におけるソフトウェア開発に従事。
また、標準のフォーマットの電話番号のITUの E.123.私の記憶の基準が何で記述しないとのマッチングが人気。
編集:私混在G.123E.123.てへ。道具 Bortzmeyer