0

有发音的单词。无论如何,我有兴趣只提取第一个单词

A  AH0
A'S  EY1 Z
A(2)  EY1
A.  EY1
A.'S  EY1 Z
A.S  EY1 Z
A42128  EY1 F AO1 R T UW1 W AH1 N T UW1 EY1 T
AAA  T R IH2 P AH0 L EY1
AABERG  AA1 B ER0 G
AACHEN  AA1 K AH0 N
AAKER  AA1 K ER0
AALSETH  AA1 L S EH0 TH
AAMODT  AA1 M AH0 T
AANCOR  AA1 N K AO2 R
AARDEMA  AA0 R D EH1 M AH0

我试过了regex= r"(\A[A-Z]+\b) | (\A[A-Z\'w]+\b)"

\A :仅匹配字符串的开头。

I still dont get the regex.
I have few conditions:
1. No starting whitespace - can be \s
2. (\A[A-Z\'w]+\b) in this: 

\b :再次来自http://docs.python.org/2/library/re.html我认为这就像一个边界 b/w 字母数字和非字母数字。

What is happening is these are being collected:
('A', ' ')
('A', ' ', 'B', 'E', 'G', 'R') is actually AABERG
('A', ' ', 'C', 'E', 'H', 'N') AACHEN
('A', ' ', 'C', 'O', 'N', 'R')
('A', ' ', 'D', 'M', 'O', 'T')
('A', ' ', 'E', 'D', 'M', 'R')
('A', ' ', 'E', 'H', 'L', 'S', 'T')  
('A', ' ', 'K', 'R', 'E') AAKER

我将它们收集为元组列表(一个单词作为元组中的单个字母)现在这就是我正在做的事情。问题是我看到当重复字母 A 在这里重复多次时:不包含“A”,而是添加了“”空白。怎么了?我只想在这里提取第一个起始词,not A(2) or whitespaces or (,),[,] or any other symbolic character except for "'\'"这就是为什么我想添加 [AZ\'w]

另外,如果有人可以告诉我如何添加多个条件,可以说

regex= r"(\A[A-Z]+\b) | (\A[A-Z\'w]+\b) | ^\A[A-Z]+\b"这个工作 ^\A[AZ]+\b" 在提取或 ^\A[AZ]+\s" 这更好吗?我很困惑。

更新

如果我也想要类似的东西

;Semi-colon
A.S
.Dot

r'[^\SA-Z\\]+上班了吗?这'\\'取自 Inbar Rose 下面的解决方案。仍在弄清楚那是做什么的

4

3 回答 3

5

如果你想要的只是文本每一行的第一个单词,你甚至不需要正则表达式:

for line in text.split('\n'):
    first_word = line.split()[0]

但是如果你坚持使用正则表达式(这也将确保你只抓住 Alphabetica ( A-Z) 和\):

for line in text.split('\n'):
    first_word = re.match(r'([A-Z\\]+)', line, re.I).group(1)

请注意,如果您实际上是从文件或其他源中读取,则假定这text是一个带有换行符(新行)的字符串,则迭代将有所不同。

于 2013-05-20T15:50:14.503 回答
2

我不是 100% 你期望的输出,但这里有一个镜头:

#!/usr/bin/env python
import re

pattern = r"^([A-Za-z]+)"

text = """A  AH0
A'S  EY1 Z
A(2)  EY1
A.  EY1
A.'S  EY1 Z
A.S  EY1 Z
A42128  EY1 F AO1 R T UW1 W AH1 N T UW1 EY1 T
AAA  T R IH2 P AH0 L EY1
AABERG  AA1 B ER0 G
AACHEN  AA1 K AH0 N
AAKER  AA1 K ER0
AALSETH  AA1 L S EH0 TH
AAMODT  AA1 M AH0 T
AANCOR  AA1 N K AO2 R
AARDEMA  AA0 R D EH1 M AH0"""

def main():
    print re.findall(pattern, text, re.MULTILINE)

if __name__ == '__main__':
    main()

输出是:

['A', 'A', 'A', 'A', 'A', 'A', 'A', 'AAA', 'AABERG', 'AACHEN', 'AAKER', 'AALSETH', 'AAMODT', 'AANCOR', 'AARDEMA']

如果您的问题变得更加复杂,我们可以对此答案进行一些小的更改。假设您需要不同的行分隔符,而不仅仅是\n. 以下模式不会使用MULTILINE,但会产生与以前相同的输出。在第一组中,您可以添加可以匹配的其他字符,例如;.

pattern = r"[\n^]([A-Za-z]+)"
print re.findall(pattern, text)
于 2013-05-20T15:52:53.843 回答
1

为什么你需要一个正则表达式呢?

with open('data.txt') as f:
     lines = list(f)
print [l.split()[0] for l in lines

有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

于 2013-05-20T15:48:31.670 回答