tweet adı semboller @ ayıklamak için normal ifade

10 Cevap

Ben şu cümle sadece @patrick @michelle ayıklamak için normal bir ifade kullanmak istiyorum:

@patrick  @michelle we having diner @home tonight do you want to join?

Not: Bu cümle başında değil de başka bir @name tarafından takip edilir, çünkü @home sonucu dahil edilmemelidir.

Herhangi bir çözüm, ipucu, yorumlar gerçekten takdir edilecek.

10 Cevap

/(?:(?:@\S+\s+)+|^)@\S+/g

İlk olmayan birçok boşluk karakterleri tarafından izlenen bir "@" veya hattının başlangıç ​​ve daha sonra birçok boşluk olmayan karakterler ardından başka bir "@" ile eşleşir eşleşir.

O @name RT, tweet örneğin ortasında veya sonunda görünür gelmesidir Twitter'da yaygın olduğunu unutmayın http://twitter.com/ceetee/statuses/9874073403. Temelde bir @ isim sadece RegEx hatta bir ayrıştırıcı kullanarak gerçekten bir isim olup olmadığını ayırt edemez. Iyi bahis http://twitter.com/name 404 veya değilse kontrol etmektir.

Eh, ilk başta ben iade edilir gruplara baktım çünkü bu başarısız düşündüm:

>>> tw = re.compile(r"^((@\w*)\s+)*")
>>> tw.findall(tweet)
[('@michelle ', '@michelle')]
>>> tw.match(tweet).groups()
('@michelle ', '@michelle')

Gruplar yalnızca re herhangi bir grup için son değeri tutmak unutmayın. Sadece grup kapmak Ama eğer (), daha sonra bütün eşleşen dize olsun:

>>> tw.match(tweet).group()
'@patrick  @michelle '

Sırıtıyor, ben pyparsing deneyeceğim:

>>> from pyparsing import Word, printables, OneOrMore
>>> atName = Word("@",printables)
>>> OneOrMore(atName).parseString(tweet).asList()
['@patrick', '@michelle']

Bu normal ifade deneyin:

/^\s*@(\w+)\s+@(\w+)/

\s boşluk karakterleri ve \w sözcük karakterlerini gösterir.

Sürece bir @ ile başlar ve bu poweshell bunu test yapacak olanlar ile devam böylece bazı regex motorları biraz farklıdır. Bu aynı zamanda satır başında n isim yakalamak

"^ ((@ \ W +) \ s) +"

Belki de böyle bir şey olsa birden kimlikleri ayıklamak için eşleşen grubundaki boşluk şey üzerinde bölmek gerekecek.

/^\s*(@\w+\s+)*\s+.*$/

You have tagged your post c#, so I assume you can use the .NET Regex imnplementation. Using .NET, the following Regex will do:

(?<![^@]\w+\s+)(@\w+)

This will match any words starting with @, that do not have a word without @ before them. Note that "dinner @home @8pm" will still break it, though.

here daha fazla bilgi için bkz.

PHP için

/^\s*@(\w+)\s+@(\w+)/

Teşekkürler KennyM

Python

msg = '@patrick  @michelle we having diner @home tonight do you want to join?'
import re
re.findall('(?:(?:@\S+\s+)+|^)@\S+', msg)

Bu cümle başında 1 ya da n @ adı ile çalışır.

Hızlı yanıt için teşekkür ederiz.

Perl'de, yararlanabiliriz /g maç-daha-daha-bir kez böylece \G sıfır genişlikli nereye-biz-left-off iddiasını ve liste bağlam, kombine niteleyici:

my $str = '@patrick  @michelle we having diner @home tonight do you want to join?';
my @matches = ($str =~ m/\G(\@\w+)\s*/g);

print join(', ', @matches) . "\n";

Bu ilk @-dizeleri herhangi bir sayıda genelinde sağlam olmalıdır.

For Python check out: http://github.com/BonsaiDen/AtarashiiFormat
It will also give you the links and the tags.

Ve basit bir regex kullanarak sakının, ben Twitter Metin Java Kütüphane dönüştürülür önce yaptım, büyük bir karmaşa ile sona erecek.

Aşağıdaki gibi C # için yapardım:

@ ([A-Za-z0-9-_ &;] +)