혼합 언어 텍스트 파일이 있고 해당 언어 중 하나로 인쇄 가능한 문자의 총 개수를 간단히 계산하고 싶습니다. 언어가 다른 유니코드 범위에 있으면 도움이 됩니다.
나의 구체적인 사용 사례에는 히브리어, 다성 그리스어 및 영어가 포함되어 있지만 이 문제에 대한 해결책은 다른 상황에서도 일반화될 수 있다고 생각합니다.
저는 히브리어 문자(예: Unicode )만 계산하고 싶습니다 [\u0590-\u05ff]
. 다음은 짧은 예제 입력 파일입니다(직접 계산한 결과 62개의 히브리어 문자 포함).
[ Ps117 ]
h1: הללו את יהוה כל גוים שבחוהו כל האמים
r1: Praise the LORD, all nations! Extol him, all peoples!
g1: Αλληλουια. Αἰνεῖτε τὸν κύριον, πάντα τὰ ἔθνη, ἐπαινέσατε αὐτόν, πάντες οἱ λαοί,
b1: Alleluia. Praise the Lord all you nations: praise him all you peoples.
h2: כי גבר עלינו חסדו ואמת יהוה לעולם הללו יה
r2: For great is his steadfast love toward us; and the faithfulness of the LORD endures for ever. Praise the LORD!
g2: ὅτι ἐκραταιώθη τὸ ἔλεος αὐτοῦ ἐφ' ἡμᾶς, καὶ ἡ ἀλήθεια τοῦ κυρίου μένει εἰς τὸν αἰῶνα.
b2: For his mercy has been abundant toward us: and the truth of the Lord endures for ever.
도움이 된다면 Ubuntu 16.04.2 LTS를 사용하고 있습니다. Perl이 가능한 옵션일 수도 있고 일부 쉘 스크립트일 수도 있을 것 같습니다. 하지만 저는 이런 것들에 대해 모르기 때문에 물어봅니다!
호기심에서 내가 입력한 줄은 다음과 같습니다: h
= 히브리어; r
= 개정 표준역; = g
칠십인역 b
; 각 경우에 절 번호가 붙습니다.
답변1
유니코드 문자열의 길이를 결정하는 데 문제가 있을 수 있습니다. 바라보다이 페이지정규화에 대한 자세한 내용은 Twitter 개발자 문서를 참조하세요.
문자 수는 구성하는 로케일에 따라 달라집니다. locale
다음을 실행하여 UTF-8 로캘이 구성되었는지 확인할 수 있습니다 . 이 작업을 완료하면 @stephen-rauch의 코드가 작동합니다.
사용하는 정규식 라이브러리에 따라 명명된 스크립트를 사용할 수도 있습니다. 예를 들어 \p{Hebrew}
다음은 히브리어가 아닌 모든 문자를 제거하는 예입니다 \P{Greek}
.\P{Hebrew}
협회
편집: 초기 결과는 잘못 구성된 로케일로 인해 발생했습니다.
답변2
이것들은 나에게 가까운 것 같습니다 (Ubuntu 16.04에서 테스트)
$ perl -0777 -MEncode -ne 'print decode("UTF-8",$_) =~ tr/\x{0590}-\x{05ff}//,"\n"' input
62
$ perl -0777 -MEncode -ne 'print decode("UTF-8",$_) =~ tr/\p{Hebrew}//,"\n"' input
63
"올바른" 대답이 무엇인지 잘 모르겠습니다.
답변3
Python을 사용하면 다음과 같은 작업을 수행할 수 있습니다.
암호:
# coding: utf-8
import re
import codecs
#find_hebrew = re.compile(ur'[\u0590-\u05ff]+') # python 2
find_hebrew = re.compile(r'[\u0590-\u05ff]+') # python 3
count = 0
with codecs.open('text_file', 'rU', encoding='utf-8') as f:
for line in f.readlines():
for n in find_hebrew.findall(line):
count += len(n)
print(count)
결과:
62