Предоставлено д-ром Хайнцем Кабуцем и его отличным информационным бюллетенем ....
Почему каждый открытый класс в отдельном файле?
Это вопрос, который меня часто спрашивали во время моих курсов. До сих пор у меня не было хорошего ответа на этот вопрос. В разделе 1 мы читаем: «Хотя каждый блок компиляции Oak может содержать несколько классов или интерфейсов, не более одного класса или интерфейса на единицу компиляции может быть общедоступным».
На боковой панели это объясняет, почему: «Это ограничение еще не реализовано компилятором, хотя это необходимо для эффективного импорта пакетов »
Это довольно очевидно - как и большинство вещей, когда вы знаете причины проекта, компилятор должен будет сделать дополнительный проход через все (.java-файлы), чтобы выяснить, какие классы были там, и что сделает компиляцию еще медленнее.
Вам нужно захватить из регулярного выражения. search
для шаблона, если он найден, извлекает строку, используя group(index)
. Предполагая, что действительные проверки выполняются:
>>> p = re.compile("name (.*) is valid")
>>> p.search(s) # The result of this is referenced by variable name '_'
<_sre.SRE_Match object at 0x10555e738>
>>> _.group(1) # group(1) will return the 1st capture.
'my_user_name'
Вы можете использовать что-то вроде этого:
import re
s = #that big string
# the parenthesis create a group with what was matched
# and '\w' matches only alphanumeric charactes
p = re.compile("name +(\w+) +is valid", re.flags)
# use search(), so the match doesn't have to happen
# at the beginning of "big string"
m = p.search(s)
# search() returns a Match object with information about what was matched
if m:
name = m.group(1)
else:
raise Exception('name not found')
p = re.compile("name (.*) is valid", re.flags) # parentheses for capture groups
print p.match(s).groups() # This gives you a tuple of your matches.
Возможно, это немного короче и понятнее:
import re
text = '... someline abc... someother line... name my_user_name is valid.. some more lines'
>>> re.search('name (.*) is valid', text).group(1)
'my_user_name'
Вы можете использовать соответствующие группы:
p = re.compile('name (.*) is valid')
, например
>>> import re
>>> p = re.compile('name (.*) is valid')
>>> s = """
... someline abc
... someother line
... name my_user_name is valid
... some more lines"""
>>> p.findall(s)
['my_user_name']
Здесь я использую re.findall
, а не re.search
, чтобы получить все экземпляры my_user_name
. Используя re.search
, вам нужно будет получить данные из группы в объекте совпадения:
>>> p.search(s) #gives a match object or None if no match is found
<_sre.SRE_Match object at 0xf5c60>
>>> p.search(s).group() #entire string that matched
'name my_user_name is valid'
>>> p.search(s).group(1) #first group that match in the string that matched
'my_user_name'
Как уже упоминалось в комментариях, вы можете сделать свое регулярное выражение неживым :
p = re.compile('name (.*?) is valid')
, чтобы подбирать материал между 'name '
и следующим ' is valid'
(вместо того, чтобы ваше регулярное выражение забирало другие ' is valid'
в вашей группе.
(.*?)
? Да, это возможно, хотя и не обязательно, если мы не используем re.DOTALL
– mgilson
11 March 2013 в 16:11
re.findall('name (.*) is valid', 'name jon clements is valid is valid is valid')
, вероятно, не даст желаемых результатов ...
– Jon Clements♦
11 March 2013 в 16:13
.group
, точно такая же, как и принятый вами ответ ...
– mgilson
11 March 2013 в 19:07
group(0)
для первого матча? – sharshofski 16 April 2015 в 14:04group(0)
возвращает согласованный текст, а не первую группу захвата. Комментарий к коду правильный, в то время как вы, кажется, путаете группы захвата и совпадения.group(1)
возвращает первую группу захвата. – andrewgu 7 August 2015 в 01:31