Если вы хотите разрешить не-латентные символы, это работает для меня очень хорошо.
"^[\\p{L}\\p{N}\\._%+-]+@[\\p{L}\\p{N}\\.\\-]+\\.[\\p{L}]{2,}$"
Он не разрешает IP после @, но самый действительный адрес электронной почты из xxx@xxx.TDL
может быть подтвержден с ним. \p{L}
проверяет UTF-буквы и \p{N}
проверяет номера UTF. Вы можете проверить этот документ для получения дополнительной информации.
Вы можете использовать метод string join . Все, что вам нужно сделать, это вызвать '_'.join
в кортеже триграмм при печати.
print(str('_'.join(entry[0]))+"\t"+str(entry[1]))
Другие примечания:
(1) Вы можете быть более питоническим и генерировать свой listText
, используя понимание списка следующим образом: listText = [word.lower() for word in lyrics.split()]
(2) Вы можете использовать setdefault
словаря вместо if/else
для увеличения / инициализации триграммы следующим образом: freq.setdefault(trigram, 0)
, а затем для увеличения freq[trigram] += 1
без использования какого-либо блока if / else. Прямо сейчас вы перебираете freq.keys()
в поиске trigram
в вашем выражении if
, которое является постоянным во времени в Python 3 (эквивалентно высказыванию trigram in freq
), но линейным во времени в Python 2.
Если вам нужно только связаться с ними, вы можете использовать str.join
trigram = (listText[0], listText[1], listText[2])
c_trigram = '_'.join(*trigram)
, вы можете увидеть пример бесстыдного самоподключения здесь